PHP dizileri vs Nesneler

5 Cevap php

Ben üzerinde yineleme ve bazı matematik gerçekleştirmek zorunda oldukları için bir sinir ağı için PHP nesneleri büyük miktarda var. Ben sınıf örnekleri üzerinde bir ilişkisel dizi kullanarak daha iyi olacağını merak ediyordum?

Etrafa 3640 nesneler ile ilgili ve bunun üstüne 500 kez (en iyi) etrafında yineleme kulüpler bu yüzden herhangi bir mikro-optimizasyon büyük bir yardımcı olur. Kaçınılmaz daha $object['value'] yapmak için hızlı olacağını $object->value?

Edit: Yani ikisi de aynıdır. Ama kurucu için biraz havai olurdu sanırım? P: Ya bir yol Ben kirli diziler için benim güzel sınıfları ticaret istiyorum sanmıyorum

5 Cevap

Eğer PHP5 kullanıyorsanız o nesneler veya dizileri arasındaki fark neredeyse anlamlı değildir. Burada bir adam iyi veri yapıları için bazı performans testleri yapar: http://aggregation.novaak.net/?q=node/227.

Ben "profil" (1000 örnekleri, 1000.000 yazar / okur) için bu kod kullanılır:

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

Bu şeyler hosting benim LINUX çıkışlar:

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

böylece bir sonuç olarak: objects are slower even on PHP 5.2. Don't use objects unless you really need their oop features.

Bize o theoretically bir daha az karıştırmak gibi daha hızlı olacak bir dizi kullanarak bu durumda bir dizi olduğunu backend olabilir gibi $object->value, nasıl çalışır için kod göstermiştir değil işlev çağrısı. Arama yapmanın maliyeti muhtemelen işlev çağrısı ile karşılaştırıldığında çok büyük olacaktır. Bu bir değişken ise, PHP nesneleri ve diziler çok benzer bir uygulama var çok az diffrence olmak için orada olacak.

Optimizasyonlar arıyorsanız, size zaman çoğunluğu nerede kullanıldığını denetlemek için Profile gerekir. Ben diziler nesneleri değişen hiçbir önemli fark olacağını sanıyorum.

Hep böyle mikro performans özellikleri için PHP-kaynak kodunu kontrol edebilirsiniz.

PHP nerede bir Arama yapmak gerekiyor, çünkü Ama ilk bakışta, hayır ['değer'] yaparak bir hashtable'a arama (1), garanti değil O olmalı hatta thougn ['değer'] daha hızlı olmayacak. Text-indeksi kullanabilirsiniz daha fazla yük var.

Nesne sadece değer olan erişmek için gereken 1 değişkenler içeriyorsa, bir nesne kullanarak daha fazla yük var.

I see this is kind of an old post so I thought I'll update it. here are my codes and stats, done on Zend CE 5.3.21 I tried to test the whole thing, storing info and pulling it back.

V1: 0.83 sn sürer

for ($i=1; $i<1000000; $i++) {
  $a = get_one();
  $b = $a[0];
  $b = $a[1];
}

function get_one() {
  return array(1,1);
}

V2: 3.05 sn sürer

for ($i=1; $i<1000000; $i++) {
  $a = get_one();
  $b = $a->v;
  $b = $a->k;
}

function get_one() {
  $ret = new test();
  $ret->v = 1;
  $reb->k = 1;
  return $ret;
}

class test {
  public $v;
  public $k;
}

V3: (yapıcı performansını artırır unutmayın) 1.98 sn sürer

for ($i=1; $i<1000000; $i++) {
  $a = get_one();
  $b = $a->v;
  $b = $a->k;
}

function get_one() {
  return new test(1,1);
}

class test {
  public $v;
  public $k;
  public function __construct($v, $k) {
    $this->v = $v;
    $this->k = $k;
  }
}