Is static method faster than non-static?
编辑:哦,我忘了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Test1{ public static function test(){ for($i=0; $i<=1000; $i++) $j += $i; } } class Test2{ public function test() { for ($i=0; $i<=1000; $i++){ $j += $i; } } } |
对于这个算法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $time_start = microtime(); $test1 = new Test2(); for($i=0; $i<=100;$i++) $test1->test(); $time_end = microtime(); $time1 = $time_end - $time_start; $time_start = microtime(); for($i=0; $i<=100;$i++) Test1::test(); $time_end = microtime(); $time2 = $time_end - $time_start; $time = $time1 - $time2; echo"Difference: $time"; |
我有结果
1 | Difference: 0.007561 |
这些天,我试图使我的方法尽可能地静态化。但这是真的吗?至少对于PHP
当您不需要方法周围的对象时,应该始终使用static,当您需要对象时,应该使用dynamic。在您提供的示例中,您不需要对象,因为该方法不与类中的任何属性或字段交互。
这个应该是静态的,因为它不需要对象:
1 2 3 4 5 6 7 8 9 | class Person { public static function GetPersonByID($id) { //run SQL query here $res = new Person(); $res->name = $sql["name"]; //fill in the object return $res; } } |
这个应该是动态的,因为它使用它所在的对象:
1 2 3 4 5 6 7 | class Person { public $Name; public $Age; public function HaveBirthday() { $Age++; } } |
速度差异是最小的,但是您必须创建一个对象来运行动态方法,并且该对象保存在内存中,因此动态方法使用更多的内存和更多的时间。
简短的回答,因为我不想大喊大叫:
它是否更快并不重要。如果您需要一个性能非常重要的东西,您可以考虑在每个函数调用中减少0.02纳秒,而不管怎样,您都不会在PHP中这样做。
静态方法会导致不稳定、无法维护的"全局一切"代码,这些代码对您的伤害比其他任何代码都大。
如果你不想使用合适的OOP(如果你知道你在做什么和为什么这样做,那就完全没问题了),那么请这样做。只是不要这样做,因为你想节省CPU时间。
http://misko.hevery.com/2008/12/15/static-methods-are-death-to-testability/
http://sebastian-bergmann.de/archives/885-stubing-hard-coded-dependencies.html
http://en.wikipedia.org/wiki/class-based_编程
如果只单击一个链接:http://www.scribd.com/doc/20893084/advanced oop and design patterns scribd
过早的优化是万恶之源。构建易于维护的代码,如果速度变慢,那么就需要一个概要文件,它很可能会告诉您文件系统或数据库有问题,如果您已经解决了所有问题,那么将有一些非常具体的PHP要优化。如果你有干净的,可改变的代码,你可以加快这些。
40年前,DonaldKnuth曾说过:"过早的优化是万恶之源"。你知道,当你有英特尔发明的新4004微处理器的时候。那只鼓被打得像任何一匹马一样厉害,我看不出它与最初的问题有什么关系。事实上,我可能很幸运,但我还没有看到这一领域猖獗行为的证据。唉,在我们都能睡上一晚之前,必须有人上网。
关于这个话题,我认为被接受的答案是最务实的,对这个问题的第一个评论是正确的。静态代码与实例化代码的速度是否更快主要取决于语言的实现方式,我认为这些响应中的任何一个都不能充分回答关于PHP的问题。有人知道PHP并且想加入吗?
一般来说,是的。静态方法和属性工作得更快(php 5.3除外)。
您可以在PHP中或多或少地参考静态和非静态方法的详细比较。
如果您打算使方法静态化,并添加一个参数来传递类对象,那么实际速度会慢一些。我用这个作为测试的基准,这是相当大的损失。通过各种静态方法传递对象是一种性能损失。最好让它们在对象中保持动态。
我相当肯定动态方法的性能会更快,因为调用是在同一个对象中进行的。在对象中使用静态方法时,每个调用都有一个额外的跃点,因为调用不是在对象中进行的,而是在类中进行的。
使用静态方法确实减少了内存使用。如果您可以将方法存储在类中,那么没有这些方法的对象将更轻。但在我的测试中最重要的是可访问性。直接访问方法是最快的,而对静态类方法的访问是额外的跃点。这真的是一个处理与记忆的问题。十分之九,动力更快。