首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP对象与数组--迭代时的性能比较

PHP对象与数组--迭代时的性能比较
EN

Stack Overflow用户
提问于 2010-02-03 23:29:14
回答 11查看 69.3K关注 0票数 96

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

我正在处理围绕3640对象和围绕500时间的迭代(充其量),所以任何微优化都会有很大帮助。做$object['value']必然比做$object->value快吗?

编辑:,因此它们都是相同的。但我猜构造函数会有一些开销?无论哪种方式,我都不想用我漂亮的类来换取脏的数组:P

EN

回答 11

Stack Overflow用户

发布于 2014-06-03 01:03:23

基于Quazzle的代码,我运行了下一段代码(5.4.16 windows 64位):

代码语言:javascript
复制
<?php
class SomeClass {
    public $aaa;
    public $bbb;
    public $ccc;
    }

function p($i) {
  echo '<pre>';
  print_r($i);
  echo '</pre>';
}


$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 '<p>arrays: '.(microtime(true) - $t0)."</p>";
echo '<p>memory: '.($fin-$inicio)."</p>";
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 '<p>arrays: '.(microtime(true) - $t0)."</p>";
echo '<p>memory: '.($fin-$inicio)."</p>";
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 '<p>arrays: '.(microtime(true) - $t0)."</p>";
echo '<p>memory: '.($fin-$inicio)."</p>";
p($z);  
?>

我得到了下一个结果:

代码语言:javascript
复制
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的结论

marginally).

  • stdClass类比数组快(但是
  1. 类是邪恶的。
  2. 类比数组占用更少的内存。(大约减少30-40%!)

ps:需要注意的是,如果定义了类,但是定义了成员,那么这个类的使用就会变慢。它还使用了更多的内存。显然秘诀在于定义成员

更新

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

代码语言:javascript
复制
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的结论

  1. 对于数组,PHP5.5比PHP5.4快,对于对象,由于PHP5.5和arrays.
  2. stdClass的优化,
  3. 类比数组慢,
  4. 类仍然比数组占用更少的内存。(大约30-40%的less!!).
  5. SplFixedArray类似于使用类,但它使用更多的内存。
票数 69
EN

Stack Overflow用户

发布于 2012-12-08 22:14:42

我使用以下代码进行“性能分析”(1,000个实例,1000.000次读/写):

代码语言:javascript
复制
function p($i) {
  echo '<pre>';
  print_r($i);
  echo '</pre>';
}


$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 '<p>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 '<p>obj: '.(microtime(true) - $t0);
p($z);

echo '<p> phpversion '.phpversion();

它在我的LINUX中输出以下内容:

代码语言:javascript
复制
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

因此,结论是:即使在PHP5.2上,对象也很慢。除非你真的需要对象的oop特性,否则不要使用对象。

票数 9
EN

Stack Overflow用户

发布于 2019-06-05 22:29:31

脚本@ PHP 7.3.5

  • SomeClass Object是最快的,lightest.
  • Array 是1.32倍的速度。2.70x memory.
  • stdClass Object 1.65x速度。2.94x内存。

原始输出:

代码语言:javascript
复制
arrays: 0.064794063568115
memory: 444920
Array (
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)
arrays: 0.048975944519043
memory: 164512
SomeClass Object (
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)
arrays: 0.081161022186279
memory: 484416
stdClass Object (
    [aaa] => aaa
    [bbb] => bbb
    [ccc] => aaabbb
)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2193049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档