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

编辑:哦,我忘了

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

你应该问自己的问题是:速度差会给你带来什么问题吗?如果没有,不要担心。

不知道。。但是如果静态方法很容易调用,而且我经常使用它。我预先假设静态方法比常规方法慢,但我的结果显示静态方法更快。只是想确认一下(就知识而言)

完成同上。首先让它工作。从您的简单测试中可以很明显地看出,这可能不是一个显著的数量级差异,因此请关注这些特性,并担心毫秒级的优化(如果它变得流行的话)。然而,当你达到这个水平的时候,你可能已经把整个事情重新考虑了几次…

啊,刚刚看到你的答复。如果你只是在寻找知识,那么请忽略我的评论;)

100次迭代并不是一个很好的测试…试着把它推到100K左右,然后看看你会有什么不同。如果你有耐心,试着做1百万次迭代。

没关系!我是那种想知道自己在做什么的人。这一切

我试了无数次,但还是一样(静态比非静态更快)

是的,静电更快。不,您不想使用static。尝试模拟UnitTest中的静态类。那你就知道为什么了。

static方法可以用于以某种方式对一组相关的方法进行分组,而不必通过简单的函数集合污染全局名称空间。

@阿米尔错了,Foo::test()和foo_test()之间没有区别。所有静态数据都是有效的全局数据。是的,foo::test只是全局名称空间中的foo,但是无论您是在函数前面加foo_u前缀还是将其放入类中,都没有什么大的区别。

静态方法在PHP中流行的唯一原因是在最新版本之前完全不支持命名空间。你只是在用愚蠢的访问方法构建函数库,一旦人们采用最新的名称空间约定,这将是第一件过时的事情。

既然您询问了性能方面的问题,我不会将其标记为重复的,而是相关的:stackoverflow.com/questions/1185605/&hellip;

我认为仅仅从单元测试的角度来看,将静态方法琐碎化有点不公平。我敢肯定95%的开发人员根本不使用它。

StackOverflow上的这篇文章提供了跨不同PHP版本的一些很好的基准测试,并很好地回答了这个问题。

当您不需要方法周围的对象时,应该始终使用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++;

}

}

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

虽然这是正确的教科书答案,静态方法是死亡的可测试性,应避免。

你听上去很有逻辑,但是+1投票决定明天接受

简短的回答,因为我不想大喊大叫:

它是否更快并不重要。如果您需要一个性能非常重要的东西,您可以考虑在每个函数调用中减少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要优化。如果你有干净的,可改变的代码,你可以加快这些。

我想斯特凡一定记下了他的幻灯片,但看起来好像有人在这里放了一份副本,看起来真是一本好书…scribd.com/doc/20893084/advanced-oop-和-design-模式

"静态方法会导致不稳定、不可维护,"GlobalEverything"代码对您的伤害比其他任何代码都大。"我完全不同意。测试静态方法比测试非静态方法更容易。class:method()比$obj=new class();$obj->method()简单。

40年前,DonaldKnuth曾说过:"过早的优化是万恶之源"。你知道,当你有英特尔发明的新4004微处理器的时候。那只鼓被打得像任何一匹马一样厉害,我看不出它与最初的问题有什么关系。事实上,我可能很幸运,但我还没有看到这一领域猖獗行为的证据。唉,在我们都能睡上一晚之前,必须有人上网。

关于这个话题,我认为被接受的答案是最务实的,对这个问题的第一个评论是正确的。静态代码与实例化代码的速度是否更快主要取决于语言的实现方式,我认为这些响应中的任何一个都不能充分回答关于PHP的问题。有人知道PHP并且想加入吗?

一般来说,是的。静态方法和属性工作得更快(php 5.3除外)。

您可以在PHP中或多或少地参考静态和非静态方法的详细比较。

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值