关于php:静态方法比非静态方法快吗?

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中或多或少地参考静态和非静态方法的详细比较。


如果您打算使方法静态化,并添加一个参数来传递类对象,那么实际速度会慢一些。我用这个作为测试的基准,这是相当大的损失。通过各种静态方法传递对象是一种性能损失。最好让它们在对象中保持动态。

我相当肯定动态方法的性能会更快,因为调用是在同一个对象中进行的。在对象中使用静态方法时,每个调用都有一个额外的跃点,因为调用不是在对象中进行的,而是在类中进行的。

使用静态方法确实减少了内存使用。如果您可以将方法存储在类中,那么没有这些方法的对象将更轻。但在我的测试中最重要的是可访问性。直接访问方法是最快的,而对静态类方法的访问是额外的跃点。这真的是一个处理与记忆的问题。十分之九,动力更快。