Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中单例类实例方法与静态类方法的性能?_Php_Singleton_Performance_Class Design_Static Methods - Fatal编程技术网

PHP中单例类实例方法与静态类方法的性能?

PHP中单例类实例方法与静态类方法的性能?,php,singleton,performance,class-design,static-methods,Php,Singleton,Performance,Class Design,Static Methods,我感兴趣的是哪种客观分析更有效;调用单例类的实例方法或静态类的方法。我已经看到了,所以我不想讨论两者之间的区别,也不想讨论哪一个更好。我只对两者之间的相对性能感兴趣。提前谢谢 -Mike在我之前所做的测试中,我发现调用静态方法比调用实例方法更快,而且内存效率更高。。。。但是单例不应该仅仅因为这些原因而被忽略。除非你在一个紧密的循环中调用它们数千次或几十万次(这意味着没有其他重要的代码,因为调用的开销很大),不要担心。这种差异可能在一微秒以下,因此不值得担心。只需做出最佳的架构选择 过早优化是万恶

我感兴趣的是哪种客观分析更有效;调用单例类的实例方法或静态类的方法。我已经看到了,所以我不想讨论两者之间的区别,也不想讨论哪一个更好。我只对两者之间的相对性能感兴趣。提前谢谢


-Mike

在我之前所做的测试中,我发现调用静态方法比调用实例方法更快,而且内存效率更高。。。。但是单例不应该仅仅因为这些原因而被忽略。

除非你在一个紧密的循环中调用它们数千次或几十万次(这意味着没有其他重要的代码,因为调用的开销很大),不要担心。这种差异可能在一微秒以下,因此不值得担心。只需做出最佳的架构选择

过早优化是万恶之源…


编辑:对于所有的反对者,我写了一篇文章,描述了为什么像这样的性能比较几乎毫无用处。

在调用singleton模式对象的实例方法之前,需要先获取实例,这需要静态方法调用:

SomeClass::getInstance()->myMethod();
// versus
SomeClass::myMethod();
因此,当您第一次需要访问函数中的对象时,您需要首先进行静态方法调用。因为函数调用从来都不是免费的,所以最好将方法设为静态。

查看此图表:)


抓起,我这次谈话有点晚了,但刚刚找到问题,我想我会把我的想法投入到我的第一篇文章中

作为一个快速实验(在阅读了zolex链接的文章之后),我在文章的基准测试中添加了第三个测试用例:

$inst = TestSingleton::getInstance();  
for($i=0;$i<$runs;$i++) $inst->test();
$inst=TestSingleton::getInstance();
对于($i=0;$itest();
当然,结果并非100%一致,但我发现,大多数时候,通过所有三种方法运行500000个调用时,上述方法的运行速度比其他两种方法快2-3秒


虽然当我看到“过早优化”这句话时,我总是感到畏缩,但在这种情况下,我认为这是一针见血的。性能差异最多是最小的,通常是支持更明智的单例使用。

+1,完全同意,另外,在谈到包装资源时,可能已经或可能没有被包装实例化(套接字流、数据库连接等),
实例()的额外开销
单件的方法被否定,因为静态函数仍然必须检查资源是否存在,并在需要时创建它。-1:没有回答这个问题,而是自言自语。这个问题与WordPress中的使用有关;插件是否应该使用静态类来封装类的挂钩或实例,这样就可以实现它ds的次数或更多。在这种情况下,没有必要使用实例,所以我选择了静态方法,但一些保持静态的方法速度太慢。我不知道事实是什么,所以我来这里寻找答案。仍然不知道答案…我回答了问题。我说不要担心。区别可能很小。让e更好的架构选择。无论哪种方式,这都是一个微观优化,所以不要担心……这也不是一个学术问题吗?@Mike使用Wordpress和担心性能是一个悖论。ircmaxell给了你最明智的建议。如果你真的关心代码的性能,请分析应用程序以找出答案瓶颈在哪里,而不是仅仅假设它们在你认为的地方。学术的x比y快,不会让你的代码运行得更快。任何人都可以制作精美的图表。没有关于所用测试设置的信息,这是毫无意义的。你至少可以提供一个链接,指向你从哪里得到它。我只是作为一个例子添加到文章中测试的作者应该大声明确地声明,他每次都在循环中调用
TestSingleton::getInstance()
,而在现实世界的应用程序中,单例实例作为参数传递给类方法(这是单例设计相对于静态类[]的优势之一)因此,这些类不会每次都调用
getInstance()
,因为它们已经存储了对Singleton对象的引用……不管怎样,在现实世界的应用程序中,仍然有许多调用Singleton
getInstance()
如果我们选择了任何引用,那么所做的测试可能是一个很好的模拟。很难说!也有测试证明
静态
调用比PHP中的方法调用慢,但在这种情况下,很难说这还取决于应用程序所做的事情。这个测试是错误的,PHP评测不是这样的简单来说。在这种情况下,您必须测量服务器端的CPU和内存消耗。在一般情况下,您还必须跟踪脚本持续时间、第一个输出字节的开始时间和最后一个输出字节的时间。您知道还有一个GC,根据GC发生的位置,它可能会改变计时。测量整个脚本执行可能会提供更准确的结果ate评估考虑了GC。有时静态速度更快,有时单例速度更快,有时创建新实例速度更快。仅供参考,我认为在这里可以找到一个更好的关于为什么更喜欢单例而不是静态类的一般答案。关于Stackoverflow,在不同的PHP版本中提供了一些很棒的基准测试,这是一个很好的答案回答问题。正确,但请阅读我在zolex答案中的评论。您的测试模拟了一个真实世界的应用程序,其中singleton对象可能作为参数传递给其他类方法(对象注入)。在这种情况下,类存储对singleton对象的引用,并且不需要调用每个