php对象和数组的效率,PHP对象与数组—迭代时的性能比较

我有大量用于神经网络的PHP对象,必须对其进行迭代并对其进行一些数学运算。 我想知道在类实例上使用关联数组是否会更好?

我要处理大约3640个对象,并在此之上(最好)迭代500次(最好),因此任何微优化都可以提供很大帮助。 难道$object['value']比$object->value更快?

编辑:所以他们都是一样的。 但是我想构造函数会有一些开销吗? 无论哪种方式,我都不认为我要用我的漂亮的类来交换脏数组:P

根据Quazzle的代码,我运行了下一个代码(5.4.16 Windows 64位):

class SomeClass {

public $aaa;

public $bbb;

public $ccc;

}

function p($i) {

echo '[cc lang="php"]';

print_r($i);

echo '

';

}

$ t0 = microtime(true);

$ arraysOf = array();

$ inicio = memory_get_usage();

对于($ i = 0; $ i <1000; $ i ++){

$ z = array();

对于($ j = 0; $ j <1000; $ j ++){

$ z ['aaa'] ='aaa';

$ z ['bbb'] ='bbb';

$ z ['ccc'] = $ z ['aaa']。$ z ['bbb'];

}

$ arraysOf [] = $ z;

}

$ fin = memory_get_usage();

回声'

数组:'。(microtime(true)-$ t0)。

";

回声'

记忆:'。($ fin- $ inicio)。"

";

p($ z);

$ t0 = microtime(true);

$ arraysOf = array();

$ inicio = memory_get_usage();

对于($ i = 0; $ i <1000; $ i ++){

$ z = new SomeClass();

对于($ j = 0; $ j <1000; $ j ++){

$ z-> aaa ='aaa';

$ z-> bbb ='bbb';

$ z-> ccc = $ z-> aaa。$ z-> bbb;

}

$ arraysOf [] = $ z;

}

$ fin = memory_get_usage();

回声'

数组:'。(microtime(true)-$ t0)。

";

回声'

记忆:'。($ fin- $ inicio)。"

";

p($ z);

$ t0 = microtime(true);

$ arraysOf = array();

$ inicio = memory_get_usage();

对于($ i = 0; $ i <1000; $ i ++){

$ z =新的stdClass();

对于($ j = 0; $ j <1000; $ j ++){

$ z-> aaa ='aaa';

$ z-> bbb ='bbb';

$ z-> ccc = $ z-> aaa。$ z-> bbb;

}

$ arraysOf [] = $ z;

}

$ fin = memory_get_usage();

回声'

数组:'。(microtime(true)-$ t0)。

";

回声'

记忆:'。($ fin- $ inicio)。"

";

p($ z);

?>

code> pre>

我得到了下一个结果:

arrays: 1.8451430797577

memory: 460416

Array

(

[aaa] => aaa

[bbb] => bbb

[ccc] => aaabbb

)

arrays: 1.8294548988342

memory: 275696

SomeClass Object

(

[aaa] => aaa

[bbb] => bbb

[ccc] => aaabbb

)

arrays: 2.2577090263367

memory: 483648

stdClass Object

(

[aaa] => aaa

[bbb] => bbb

[ccc] => aaabbb

)

PHP 5.4的结论

类比数组要快(但略微)。

stdClass是邪恶的。

类使用的内存少于数组。 (减少约30-40%!)

ps:请注意,如果定义了类,但定义了成员,则使用此类的速度较慢。它还使用更多的内存。显然,秘密在于定义成员

更新资料

我从php 5.4更新到了php 5.5(5.5.12 x86 windows)。

arrays: 1.6465699672699

memory: 460400

Array

(

[aaa] => aaa

[bbb] => bbb

[ccc] => aaabbb

)

arrays: 1.8687851428986

memory: 363704

SplFixedArray Object

(

[0] => aaa

[1] => bbb

[2] => aaabbb

)

arrays: 1.8554251194

memory: 275568

SomeClass Object

(

[aaa] => aaa

[bbb] => bbb

[ccc] => aaabbb

)

arrays: 2.0101680755615

memory: 483656

stdClass Object

(

[aaa] => aaa

[bbb] => bbb

[ccc] => aaabbb

)

PHP 5.5的结论

对于数组,PHP 5.5比PHP 5.4快,对于对象,它几乎相同

由于PHP 5.5和数组的优化,因此类比数组慢。

stdClass是邪恶的。

与数组相比,类仍然使用更少的内存。 (大约减少30-40%!)。

SplFixedArray与使用Class类似,但是它使用更多的内存。

先生,祝您一切顺利。将其扩展到嵌套数组等会很有趣。其他PHP性能的有趣站点:phpbench.com php-benchmark-script.com,但我也喜欢使用内存。

使用PHP7,数组和对象之间的差异变得更加明显。您的脚本显示出30%的运行时间和60%的内存差异。那只是我的机器,但根据经验:不要将数组用作结构。使用对象代替:)

在这种情况下,对象与类是否不同?

我将此代码用于"概要分析"(1000个实例,1000.000次读/写):

function p($i) {

echo '[cc lang="php"]';

print_r($i);

echo '

';

}

$ t0 = microtime(true);

对于($ i = 0; $ i <1000; $ i ++){

$ z = array();

对于($ j = 0; $ j <1000; $ j ++){

$ z ['aaa'] ='aaa';

$ z ['bbb'] ='bbb';

$ z ['ccc'] = $ z ['aaa']。$ z ['bbb'];

}

}

回声'

数组:'。(microtime(true)-$ t0);

p($ z);

$ t0 = microtime(true);

对于($ i = 0; $ i <1000; $ i ++){

$ z =(对象)null;

对于($ j = 0; $ j <1000; $ j ++){

$ z-> aaa ='aaa';

$ z-> bbb ='bbb';

$ z-> ccc = $ z-> aaa。$ z-> bbb;

}

}

回声'

obj:'。(microtime(true)-$ t0);

p($ z);

回声'

phpversion'.phpversion();

code> pre>

它在托管这些东西的LINUX中输出:

arrays: 1.1085488796234

Array

(

[aaa] => aaa

[bbb] => bbb

[ccc] => aaabbb

)

obj: 1.2824709415436

stdClass Object

(

[aaa] => aaa

[bbb] => bbb

[ccc] => aaabbb

)

phpversion 5.2.17

因此可以得出一个结论:即使在PHP 5.2上,对象也较慢。除非确实需要它们的oop功能,否则不要使用它们。

来自用户levans stackoverflow.com/users/1473035/levans:我在5.3.8上运行,对象速度较慢,数组的速度为0.51839280128479,而对象的速度为0.85355806350708。我也在5.4.13上运行它并得到了相反的结果,这可能是由于5.4中进行的类优化,即数组的0.6256799697876与0.43650078773499。因此,看起来好像桌子已经翻转了,现在对象已成为路要走。

好的答案,我刚刚在XAMPP(Apache)上进行了测试,并得到以下结果:数组:0.5174868106842数组([aaa] => aaa [bbb] => bbb

=> aaabbb)obj:0.72189617156982 stdClass对象([aaa] => aaa [bbb] => bbb [ccc] => aaabbb)phpversion 5.4.19

我也在5.4.13上运行,但与Jean-Bernard Pellerin的相反:数组:0.5020840167999对象:1.0378720760345所以我现在还不会提交对象。

我在代码中做了一些更改,并且Class比Arrays for php 5.4(5.4.16 32位Windows)要快。我提出了一个新的答案,解释了原因。

PHP 5.5.11结果:数组:0.17430,对象:0.24183

PHP 7.0 :::::数组:0.58 vs. Obj:0.59

数组:0.538612127304 obj:0.488164186478 phpversion 7.0.8

[/collapse]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值