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

wtzytmuj  于 2023-04-19  发布在  PHP
关注(0)|答案(6)|浏览(228)

编辑::哦,我忘了

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是这样的

igetnqfo

igetnqfo1#

当你不需要在你的方法周围使用对象时,你应该总是使用static,当你需要一个对象时,你应该使用dynamic。在你提供的例子中,你不需要一个对象,因为方法不与你的类中的任何属性或字段交互。
这个应该是静态的,因为它不需要对象:

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

速度差异是最小的,但是你必须创建一个对象来运行动态方法,这个对象保存在内存中,所以动态方法使用更多的内存和更多的时间。

wvt8vs2t

wvt8vs2t2#

简单回答,因为我不想太多地咆哮:
它是否更快并不重要,如果你需要的东西的性能是如此重要,你认为剃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

Premature optimization is the root of all evil.构建易于维护的代码,如果它变慢了,做一个配置文件,它很可能会告诉你文件系统或数据库有问题,如果你把所有的问题都解决了,就会有一些非常具体的php需要优化。如果你有干净的,可更改的代码,你可以加快这些速度。

iyr7buue

iyr7buue3#

“过早的优化是万恶之源”是唐纳德·克努特在40年前说过的。你知道,当你拥有英特尔发明的新的4004微处理器的时候。这个鼓被敲得像任何马一样硬,我看不出它与最初的问题有什么关系。事实上,我可能是幸运的,但我还没有看到这种猖獗行为的证据。唉,在我们晚上大吃一顿之前,互联网上的某个人必须是正确的。
关于这个主题,我认为公认的答案是最务实的,第一个评论是正确的问题。静态代码和示例化代码是否更快主要取决于语言的实现方式,我不认为这些回答中的任何一个都足以回答关于PHP的问题。有人知道PHP并想权衡一下吗?

balp4ylt

balp4ylt4#

一般来说,是的。静态方法和属性工作得更快(PHP 5.3除外)。
你可以参考这个或多或少详细的comparison of static and non-static methods in PHP

wh6knrhe

wh6knrhe5#

类似的问题:在PHP中使用静态方法和属性是否占用更少的内存?
我刚刚改进了Stanislav的链接的基准,使其能够运行:
https://3v4l.org/rDpVv

Results for PHP 7.4.1:

Runs by case: 500000 
Memory usage at start: 426,320

Run                                 Duration    %       Memory
Dynamic                             0.0594      30%     496
Dynamic instantiated                0.0917      46%     0           #
Dynamic instantiated stored         0.1994      100%    48,967,472  # slowest
Storage only                        0.0422      21%     16,781,392
Cost of instations only when stored 0.1572      79%     32,186,O8O  # cost of stored instatiations minus storage cost (diff of 2 previous lines)
Static                              0.0870      44%     0           # equivalent to dynamic with instantiation
Singletons with many getInstance    0.1213      61%     376
Singletons with one getInstance     0.0669      34%     320         # equivalent to "Dynamic"
Functions assigning $GLOBALS        0.0605      30%     0           # more than 2 times longer than using "global"
Functions assigning a global        0.0458      23%     32          # fastest. 32bits allocated? probably passed by copy... odd
Functions with $counter by ref      0.0707      35%     0           # slow for functions
Functions with $counter static prop 0.0524      26%     0

备注:

  • “函数修改一个全局”是最快的,有23%
  • “示例化,存储,然后调用一个动态方法”是最长的,所以100%
  • 存储示例会消耗大量内存和总时间的21%
  • “通过ref传递$counter作为参数”比“函数修改全局变量”长近2倍
  • 调用一个函数修改静态属性是超级快的,几乎是调用一个静态方法的一半。有趣
  • MyClass::call()花费的时间是Singleton::getInstance()-〉call()的75%,但是是$mySingleton-〉call()的133%
  • MyClass::call()的开销与(new MyClass)-〉call()的开销相同
  • “静态”在开销上与“动态的非存储”是等价的。真的很有趣!

开发实践结论(2020年1月有效):

  • 永远不要使用$GLOBALS,'global $myVar'超级快(并且分配32位?)
  • 只使用全局变量和函数编程是最快的PHP可能吗?老派摇滚!
  • 存储一个示例用于许多方法调用,然后删除它是最佳的。
  • 避免存储大量示例。
  • “为调用示例化”和“静态调用”具有相同的开销

干杯
PS:我不能做更多的运行,由于限制,即使结果不是100%稳定(我看到20%的变化,一些刷新的完整的板凳)PS 2:如果你想禁用www.example.com该高速缓存3v4l.org,只需在代码中添加一个空格即可

1u4esq0p

1u4esq0p6#

如果你打算让你的方法静态化,并添加一个参数来传递你的类对象,那实际上会更慢。我用这个做了一个基准测试,这是一个相当大的损失。通过各种静态方法传递对象是一个性能损失。最好让它们在对象中保持动态。
我相当肯定动态方法的性能更快,因为调用是在同一个对象中进行的。在对象中使用静态方法,每次调用都有一个额外的跳跃,因为调用不是在对象中进行的,而是在类中进行的。
使用静态方法确实可以减少内存的使用。如果你可以把你的方法放在类中,没有它们的对象会更轻。但在我的测试中最重要的是可访问性。直接访问方法是最快的,而访问静态类方法是一个额外的跳跃。这实际上是处理与内存的问题。十有八九,动态更快。

相关问题