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

2022-08-30 23:56:17

编辑::哦,我忘了

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

}

对于此算法

$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";

我有结果

Difference: 0.007561 

这些天,我试图使我的方法尽可能静态。但这是真的吗, ..至少对于 php


答案 1

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

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

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

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

class Person {
    public $Name;
    public $Age;
    public function HaveBirthday() {
        $Age++;
    }
}

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


答案 2

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

如果它更快也没关系。如果你需要一些性能很重要的东西,你考虑每个函数调用减少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片段进行优化。如果你有干净、可更改的代码,你可以加快速度。


推荐