我有大量用于神经网络的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]