当前位置:  开发笔记 > 编程语言 > 正文

PHP对象与数组

如何解决《PHP对象与数组》经验,为你挑选了2个好方法。

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

我正在处理周围的3640对象并在此基础上迭代500(最好),因此任何微优化都有很大帮助.它不可避免地会$object['value']比这更快$object->value吗?

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



1> magallanes..:

根据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.5比PHP 5.4更快,对于对象它几乎是相同的

    由于PHP 5.5和数组的优化,类比Arrays慢.

    stdClass是邪恶的.

    类仍然比Arrays使用更少的内存.(减少约30-40%!!).

    SplFixedArray类似于使用Class但它使用更多内存.


使用PHP7,数组和对象之间的差异变得更加重要.您的脚本显示30%运行时和60%内存的差异.这只是我的机器,但作为一个经验法则:不要使用数组作为结构.改为使用对象:)

2> 小智..:

我使用此代码进行"分析"(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功能,否则不要使用对象.


来自用户levans http://stackoverflow.com/users/1473035/levans:我用5.3.8运行它,对象速度较慢,阵列为0.51839280128479,对象为0.85355806350708.我也在5.4.13运行它并得到了相反的结果,可能是由于5.4,6.6256799697876对阵列的类优化和0.43650078773499.因此看起来桌子已经转动,现在是对象.
推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有