SORU
3 ŞUBAT 2010, ÇARŞAMBA


PHP Nesneleri vs Diziler

Üzerinde yineleme ve bazı matematik gerçekleştirmek için var sinirsel bir ağ için PHP nesneleri büyük miktarda var. Eğer sınıf örnekleri üzerinde ilişkilendirilebilir bir dizi kullanarak daha iyi olacağını merak ediyordum?

Mikro-optimizasyon herhangi bir büyük bir anlaşma yardımcı olur 3640 nesneleri ile ilgili ve bunun üzerine 500 times (en iyi) yineleme. Kaçınılmaz $object->value $object['value'] yapmak daha hızlı olur mu?

Düzenleme:İkisi de aynı. Ama kurucu için biraz havai olacak sanırım? Ya kirli diziler için güzel derslerimde takas etmek istiyorum sanmıyorum :P

CEVAP
2 HAZİRAN 2014, PAZARTESİ


Quazzle kodu merkezli bir sonraki kod (5.4.16 windows 64bits) koştu:

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

Ve sonraki sonucu elde ettim:

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 için sonuç 5.4

  1. Sınıf Diziler daha oruç (ama çok az).
  2. stdClass kötü.
  3. Sınıf Diziler daha az bellek kullanır. (30-40% daha az!!)

ps: sınıfı tanımlanır ama üyeleri daha sonra, bu sınıf yavaş ise bir not gibi. Ayrıca daha fazla bellek kullanır.Görünüşe göre gizli üyeleri tanımlamak için

Güncelleme

Php 5.4 5.5 (5.5.12 x 86 windows) php için güncelledim.

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 için sonuç

  1. Diziler için, PHP 5.5 daha hızlı PHP daha nesne için 5.4, hemen hemen aynı
  2. Sınıf PHP 5.5 ve diziler optimizasyonu için Diziler sayesinde daha yavaştır.
  3. stdClass kötü.
  4. Sınıf hala Diziler daha az bellek kullanır. (30-40% daha az!!).
  5. SplFixedArray bir Sınıf kullanmak için benzer, ancak daha fazla bellek kullanır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BioHunta

    BioHunta

    28 Mayıs 2006
  • RyanXLT

    RyanXLT

    22 Ocak 2011
  • TechRax

    TechRax

    21 EYLÜL 2009