静态方法比非静态方法快吗?

San*_*kha 12 php methods performance static object

编辑::哦,我忘了

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;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

对于这个算法

$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";
Run Code Online (Sandbox Code Playgroud)

我有结果

Difference: 0.007561 
Run Code Online (Sandbox Code Playgroud)

而这些天,我试图让我的方法尽可能静态.但它真的是真的,至少对于PHP来说

Jan*_*rre 35

当您不需要方法周围的对象时,应始终使用静态,并在需要对象时使用动态.在您提供的示例中,您不需要对象,因为该方法不会与类中的任何属性或字段交互.

这个应该是静态的,因为它不需要一个对象:

class Person {
    public static function GetPersonByID($id) {
        //run SQL query here
        $res = new Person();
        $res->name = $sql["name"];
        //fill in the object
        return $res;
    }
}
Run Code Online (Sandbox Code Playgroud)

这个应该是动态的,因为它使用它所在的对象:

class Person {
    public $Name;
    public $Age;
    public function HaveBirthday() {
        $Age++;
    }
}
Run Code Online (Sandbox Code Playgroud)

速度差异很小,但您必须创建一个对象来运行动态方法,并且该对象保存在内存中,因此动态方法使用更多内存和更多时间.

  • 虽然这是正确的教科书答案,[静态方法是可测试性的死亡](http://misko.hevery.com/2008/12/15/static-methods-are-death-to-testability),应该避免. (5认同)

edo*_*ian 19

简短回答,因为我不想咆哮太多:

它是否更快并不重要.如果你需要一些性能非常重要的东西,你认为每个函数调用削减0.02纳秒,而不是你在PHP中不会这样做.

静态方法使得不可测试的,不可维护的"全局一切"代码比其他任何东西都会伤害到你.

如果你不想使用适当的OOP(如果你知道你在做什么以及为什么这样做,那就完全没问题了)那么请你这样做.只是不要这样做,因为你想节省CPU时间.

http://misko.hevery.com/2008/12/15/static-methods-are-death-to-testability/

http://sebastian-bergmann.de/archives/885-Stubbing-Hard-Coded-Dependencies.html

http://en.wikipedia.org/wiki/Class-based_programming

如果您只点击一个链接: http ://www.scribd.com/doc/20893084/Advanced-OOP-and-Design-Patterns#scribd

过早优化是万恶之源.构建易于维护的代码,如果它变得缓慢,需要一个配置文件,它很可能会告诉你数据库中的文件系统是有问题的,你得到的所有内容都会有一些非常具体的php要优化.如果你有干净,可更改的代码,你可以加快这些速度.

  • “静态方法会产生不可测试、不可维护的“全局一切”代码,这对你的伤害比其他任何东西都大。” 我完全不同意。测试静态方法比测试非静态方法更容易。Class:method() 比 $obj=new Class() 简单;$obj-&gt;method(). (3认同)

小智 5

40 年前, Donald Knuth曾说过“过早的优化是万恶之源” 。您知道,当您拥有英特尔发明的新型 4004微处理器时。那面鼓的敲击力与任何马一样猛烈,我看不出它与最初的问题有什么关系。事实上,我可能很幸运,但我还没有在该领域看到这种猖獗行为的证据。唉,必须有人在互联网上提供正确的信息,我们才能安然入睡。

更多关于主题,我认为接受的答案是最务实的,对这个问题的第一个评论是正确的。静态代码与实例化代码是否更快主要取决于语言的实现方式,并且我认为这些响应中的任何一个都不足以回答有关 PHP 的问题。有人了解 PHP 并想参与其中吗?