编辑::哦,我忘了
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是这样的
6条答案
按热度按时间igetnqfo1#
当你不需要在你的方法周围使用对象时,你应该总是使用static,当你需要一个对象时,你应该使用dynamic。在你提供的例子中,你不需要一个对象,因为方法不与你的类中的任何属性或字段交互。
这个应该是静态的,因为它不需要对象:
这个应该是动态的,因为它使用它所在的对象:
速度差异是最小的,但是你必须创建一个对象来运行动态方法,这个对象保存在内存中,所以动态方法使用更多的内存和更多的时间。
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需要优化。如果你有干净的,可更改的代码,你可以加快这些速度。
iyr7buue3#
“过早的优化是万恶之源”是唐纳德·克努特在40年前说过的。你知道,当你拥有英特尔发明的新的4004微处理器的时候。这个鼓被敲得像任何马一样硬,我看不出它与最初的问题有什么关系。事实上,我可能是幸运的,但我还没有看到这种猖獗行为的证据。唉,在我们晚上大吃一顿之前,互联网上的某个人必须是正确的。
关于这个主题,我认为公认的答案是最务实的,第一个评论是正确的问题。静态代码和示例化代码是否更快主要取决于语言的实现方式,我不认为这些回答中的任何一个都足以回答关于PHP的问题。有人知道PHP并想权衡一下吗?
balp4ylt4#
一般来说,是的。静态方法和属性工作得更快(PHP 5.3除外)。
你可以参考这个或多或少详细的comparison of static and non-static methods in PHP。
wh6knrhe5#
类似的问题:在PHP中使用静态方法和属性是否占用更少的内存?
我刚刚改进了Stanislav的链接的基准,使其能够运行:
https://3v4l.org/rDpVv
备注:
开发实践结论(2020年1月有效):
干杯
PS:我不能做更多的运行,由于限制,即使结果不是100%稳定(我看到20%的变化,一些刷新的完整的板凳)PS 2:如果你想禁用www.example.com该高速缓存3v4l.org,只需在代码中添加一个空格即可
1u4esq0p6#
如果你打算让你的方法静态化,并添加一个参数来传递你的类对象,那实际上会更慢。我用这个做了一个基准测试,这是一个相当大的损失。通过各种静态方法传递对象是一个性能损失。最好让它们在对象中保持动态。
我相当肯定动态方法的性能更快,因为调用是在同一个对象中进行的。在对象中使用静态方法,每次调用都有一个额外的跳跃,因为调用不是在对象中进行的,而是在类中进行的。
使用静态方法确实可以减少内存的使用。如果你可以把你的方法放在类中,没有它们的对象会更轻。但在我的测试中最重要的是可访问性。直接访问方法是最快的,而访问静态类方法是一个额外的跳跃。这实际上是处理与内存的问题。十有八九,动态更快。