我有一个神经网络的大量PHP对象,我必须迭代它并执行一些数学运算.我想知道我是否会更好地在类的实例上使用关联数组?
我正在处理周围的3640
对象并在此基础上迭代500
(最好),因此任何微优化都有很大帮助.它不可避免地会$object['value']
比这更快$object->value
吗?
编辑:所以他们都是一样的.但我想构造函数会有一点开销吗?无论哪种方式,我都不认为我想在我的漂亮类中交换脏数组:P
根据Quazzle的代码,我运行了下一个代码(5.4.16 windows 64bits):
'; print_r($i); echo ''; } $t0 = microtime(true); $arraysOf=array(); $inicio=memory_get_usage(); for ($i=0; $i<1000; $i++) { $z = array(); for ($j=0; $j<1000; $j++) { $z['aaa'] = 'aaa'; $z['bbb'] = 'bbb'; $z['ccc'] = $z['aaa'].$z['bbb']; } $arraysOf[]=$z; } $fin=memory_get_usage(); echo '
arrays: '.(microtime(true) - $t0)."
"; echo 'memory: '.($fin-$inicio)."
"; p($z); $t0 = microtime(true); $arraysOf=array(); $inicio=memory_get_usage(); for ($i=0; $i<1000; $i++) { $z = new SomeClass(); for ($j=0; $j<1000; $j++) { $z->aaa = 'aaa'; $z->bbb = 'bbb'; $z->ccc = $z->aaa.$z->bbb; } $arraysOf[]=$z; } $fin=memory_get_usage(); echo 'arrays: '.(microtime(true) - $t0)."
"; echo 'memory: '.($fin-$inicio)."
"; p($z); $t0 = microtime(true); $arraysOf=array(); $inicio=memory_get_usage(); for ($i=0; $i<1000; $i++) { $z = new stdClass(); for ($j=0; $j<1000; $j++) { $z->aaa = 'aaa'; $z->bbb = 'bbb'; $z->ccc = $z->aaa.$z->bbb; } $arraysOf[]=$z; } $fin=memory_get_usage(); echo 'arrays: '.(microtime(true) - $t0)."
"; echo 'memory: '.($fin-$inicio)."
"; p($z); ?>我获得了下一个结果:
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.4更快,对于对象它几乎是相同的
由于PHP 5.5和数组的优化,类比Arrays慢.
stdClass是邪恶的.
类仍然比Arrays使用更少的内存.(减少约30-40%!!).
SplFixedArray类似于使用Class但它使用更多内存.
我使用此代码进行"分析"(1000个实例,1000.000个读/写):
function p($i) { echo ''; print_r($i); echo ''; } $t0 = microtime(true); for ($i=0; $i<1000; $i++) { $z = array(); for ($j=0; $j<1000; $j++) { $z['aaa'] = 'aaa'; $z['bbb'] = 'bbb'; $z['ccc'] = $z['aaa'].$z['bbb']; } } echo 'arrays: '.(microtime(true) - $t0); p($z); $t0 = microtime(true); for ($i=0; $i<1000; $i++) { $z = (object) null; for ($j=0; $j<1000; $j++) { $z->aaa = 'aaa'; $z->bbb = 'bbb'; $z->ccc = $z->aaa.$z->bbb; } } echo '
obj: '.(microtime(true) - $t0); p($z); echo '
phpversion '.phpversion();
它输出在我的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功能,否则不要使用对象.