Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP Objects vs Arrays -- Performance comparison while iterating

I have a huge amount of PHP objects for a neural network for which I have to iterate over and perform some maths on. I was wondering if I would be better off using an associative array over instances of classes?

I am dealing with around 3640 objects and iterating around 500 times (at best) on top of that so any micro-optimization helps a great deal. Would it inevitably be quicker to do $object['value'] than $object->value?

Edit: So they are both the same. But I guess there would be a little overhead for the constructor? Either way I don't think I want to trade in my beautiful classes for dirty arrays :P

like image 544
Louis Avatar asked Feb 03 '10 15:02

Louis


People also ask

Which is faster array or object in PHP?

Conclusion for php 5.5. Class is slower than Arrays thanks to the optimization of PHP 5.5 and arrays. stdClass is evil. Class still uses less memory than Arrays.

What is the difference between array and object in PHP?

An object is an instance of a class. It is simply a specimen of a class and has memory allocated. Array is the data structure that stores one or more similar type of values in a single name but associative array is different from a simple PHP array.


1 Answers

Based in the code of Quazzle, i ran the next code (5.4.16 windows 64bits):

<?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);   ?> 

And i obtained the next result:

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 ) 

Conclusion for php 5.4

  1. Class is fasts than Arrays (but marginally).
  2. stdClass is evil.
  3. Class uses less memory than Arrays. (about 30-40% less!!)

ps: as a note, if the class is defined but the members then, the use of this class is slower. It also uses more memory. Apparently the secret is to define the members

Update

I updated from php 5.4 to 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 ) 

Conclusion for php 5.5

  1. For arrays, PHP 5.5 is faster than PHP 5.4, for object it is pretty much the same
  2. Class is slower than Arrays thanks to the optimization of PHP 5.5 and arrays.
  3. stdClass is evil.
  4. Class still uses less memory than Arrays. (about 30-40% less!!).
  5. SplFixedArray is similar to use a Class but it uses more memory.
like image 104
magallanes Avatar answered Oct 14 '22 17:10

magallanes