我对客观分析哪种方法更高效感兴趣:调用单例类的实例方法或静态类的方法。我已经看过这个,所以我不想讨论两者之间的区别或哪种更好。我只关心两者之间的相对性能。提前致谢。
-Mike
-Mike
TestSingleton::getInstance()
。而在真实世界的应用程序中,Singleton 实例有时会被传递为类方法的参数(这是 Singleton 设计与静态类之间的优势之一[https://dev59.com/rlnUa4cB1Zd3GeqPb531#6829705]),因此这些类不会每次都调用 getInstance()
,因为它们已经存储了对 Singleton 对象的引用... - Marco DemaiogetInstance()
的调用而没有存储任何引用,如果是这种情况,则所做的测试可能是一个很好的模拟。很难说!还有一些测试证明 static
调用比方法调用慢 在 PHP 中 https://dev59.com/VnM_5IYBdhLWcg3wNwUv 但即使在那种情况下,也很难说,这也取决于应用程序的操作 https://dev59.com/VnM_5IYBdhLWcg3wNwUv/php-performance-of-static-methods-vs-functions/7045679#7045679 - Marco Demaioinstance()
方法的额外开销将被抵消,因为静态函数仍然需要检查资源是否存在并在需要时创建它。 - Wrikken在调用单例模式对象的实例方法之前,您需要先获取该实例,这需要进行静态方法调用:
SomeClass::getInstance()->myMethod();
// versus
SomeClass::myMethod();
因此,在函数中第一次访问该对象时,您需要首先进行静态方法调用。由于函数调用从未是免费的,因此最好使方法为静态的。
我有点晚加入这个对话,但是刚找到这个问题,我想在我的第一篇SO帖子中分享我的想法。
作为一个快速实验(在阅读zolex链接的文章后),我向文章的基准测试添加了第三个测试用例:
$inst = TestSingleton::getInstance();
for($i=0;$i<$runs;$i++) $inst->test();
当然,结果并不总是100%一致的,但我发现在运行500,000个调用通过所有三种方法时,上述方法比其他两种方法快2-3秒。
虽然我总是会看到“过早优化”的引用而感到不安,但在这种情况下,我认为它恰如其分。性能差异最多只是微不足道的,并且通常更倾向于更合理的单例使用。
getIntance
。但是zolex的测试仍然模拟了真实世界的应用程序,其中单例getIntance
在代码中的任何地方都被调用,而不需要首先存储引用(当使用不同的单例类时甚至不是一个选项)。因此,两个测试都是正确的!但很难说哪个更好地模拟了真实世界的应用程序。 - Marco Demaio