Berdasarkan kode Quazzle, saya menjalankan kode berikutnya (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);
?>
Dan saya mendapatkan hasil selanjutnya:
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
)
Kesimpulan untuk php 5.4
- Kelas lebih cepat daripada Array (tapi sedikit).
- stdClass itu jahat.
- Kelas menggunakan lebih sedikit memori daripada Array. (sekitar 30-40% lebih sedikit !!)
ps: sebagai catatan, jika kelas didefinisikan tetapi anggotanya maka, penggunaan kelas ini lebih lambat. Ini juga menggunakan lebih banyak memori. Rupanya rahasianya adalah mendefinisikan anggota
Memperbarui
Saya memperbarui dari php 5.4 ke php 5.5 (jendela 5.5.12 x86).
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
)
Kesimpulan untuk php 5.5
- Untuk array, PHP 5.5 lebih cepat dari PHP 5.4, untuk objek hampir sama
- Kelas lebih lambat daripada Array berkat optimalisasi PHP 5.5 dan array.
- stdClass itu jahat.
- Class masih menggunakan lebih sedikit memori daripada Array. (sekitar 30-40% lebih sedikit !!).
- SplFixedArray mirip dengan menggunakan Kelas tetapi menggunakan lebih banyak memori.
Saya menggunakan kode ini untuk "membuat profil" (1000 kejadian, 1000.000 baca / tulis):
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();
Ini menghasilkan LINUX saya yang menghosting hal ini:
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
jadi kesimpulannya: objek lebih lambat bahkan di PHP 5.2. Jangan gunakan objek kecuali Anda benar-benar membutuhkan fitur oopnya.
sumber
Saya menggunakan kode magallanes di bawah php 7.0.9:
arrays: 0.19802498817444 memory: 324672 Array ( [aaa] => aaa [bbb] => bbb [ccc] => aaabbb ) arrays: 0.18602299690247 memory: 132376 SomeClass Object ( [aaa] => aaa [bbb] => bbb [ccc] => aaabbb ) arrays: 0.1950249671936 memory: 348296 stdClass Object ( [aaa] => aaa [bbb] => bbb [ccc] => aaabbb )
Dan pengguna php 7.1.3:
arrays: 0.59932994842529 memory: 444920 Array ( [aaa] => aaa [bbb] => bbb [ccc] => aaabbb ) arrays: 0.72895789146423 memory: 164512 SomeClass Object ( [aaa] => aaa [bbb] => bbb [ccc] => aaabbb ) arrays: 0.61777496337891 memory: 484416 stdClass Object ( [aaa] => aaa [bbb] => bbb [ccc] => aaabbb )
sumber
$a=new stdClass(); $a->{1} = 1; $b=(array)$a;
get real ['1' => 1].magallanes 'script @ PHP 7.3.5
SomeClass Object
adalah yang tercepat dan teringan.Array
Kecepatan 1,32x . 2.70x memori.stdClass Object
Kecepatan 1,65x . 2.94x memori.Output mentah:
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 )
sumber
Bagi siapa saja yang masih tertarik dengan pertanyaan ini :) Saya menjalankan kode Quazzle pada PHP 7.1 Ubuntu x64 dan mendapatkan jawaban ini:
arrays: 0.24848890304565 memory: 444920 Array ( [aaa] => aaa [bbb] => bbb [ccc] => aaabbb ) arrays: 0.23238587379456 memory: 164512 SomeClass Object ( [aaa] => aaa [bbb] => bbb [ccc] => aaabbb ) arrays: 0.24422693252563 memory: 484416 stdClass Object ( [aaa] => aaa [bbb] => bbb [ccc] => aaabbb )
Kesimpulan
Larik mengambil 4 (!) Memori dari objek kelas.
Kelaskan objek sedikit lebih cepat.
stdClass masih jahat © magallanes :)
sumber
Anda belum menunjukkan kepada kami kode untuk cara
$object->value
kerjanya, karena bisa jadi backend itu adalah array yang secara teoritis menggunakan array akan lebih cepat karena melibatkan satu panggilan fungsi yang lebih sedikit. Biaya melakukan pencarian mungkin akan sangat besar dibandingkan dengan pemanggilan fungsi. Jika ini adalah sebuah variabel, akan ada sedikit perbedaan karena objek dan array di PHP memiliki implementasi yang sangat mirip.Jika Anda melihat pengoptimalan, Anda perlu membuat profil untuk memeriksa di mana sebagian besar waktu digunakan. Saya menduga bahwa mengubah objek menjadi array tidak akan membuat perbedaan besar.
sumber
Saya melihat ini adalah semacam posting lama jadi saya pikir saya akan memperbaruinya. berikut adalah kode dan statistik saya, dilakukan pada Zend CE 5.3.21 Saya mencoba untuk menguji semuanya, menyimpan info dan menariknya kembali.
V1: membutuhkan waktu 0,83 detik
for ($i=1; $i<1000000; $i++) { $a = get_one(); $b = $a[0]; $b = $a[1]; } function get_one() { return array(1,1); }
V2: membutuhkan waktu 3,05 detik
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: membutuhkan waktu 1,98 detik (perhatikan bahwa konstruktor meningkatkan kinerja)
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; } }
sumber
Anda selalu dapat memeriksa kode sumber PHP untuk fitur kinerja mikro seperti itu.
Tapi sekilas, tidak melakukan ['value'] tidak akan lebih cepat karena PHP perlu melakukan Lookup di mana menemukan ['value'] meskipun pencarian hashtable harus O (1), itu tidak dijamin. Ada lebih banyak biaya tambahan saat Anda menggunakan indeks teks.
Jika objek hanya berisi 1 variabel yang perlu Anda akses yang bernilai, ada lebih banyak overhead dalam menggunakan objek.
sumber
Saya penasaran hari ini berdasarkan tolok ukur @magallanes, jadi saya mengembangkannya sedikit. Saya menaikkan beberapa loop for untuk benar-benar menyorot celah di antara berbagai hal. Ini berjalan di Apache 2.4, mod_php, dan PHP 7.2.
Berikut tabel ringkasan untuk mempermudah hasil:
+---------------------------+---------+-----------------+ | Test | Memory | Time | +---------------------------+---------+-----------------+ | Array | 2305848 | 9.5637300014496 | | stdClass | 2505824 | 11.212271928787 | | SomeClass | 164920 | 3.9636149406433 | <-- * | AnotherClass | 2563136 | 10.872401237488 | | SetterClass | 905848 | 59.879059791565 | | SetterClassDefineReturn | 905792 | 60.484427213669 | | SetterClassSetFromParam | 745792 | 62.783381223679 | | SetterClassSetKeyAndParam | 745824 | 72.155715942383 | +---------------------------+---------+-----------------+ * - Winner winner chicken dinner
Di bawah ini adalah skrip yang dimodifikasi. Saya ingin menguji properti pengaturan dengan metode dan jenis definisi. Saya sangat terkejut menemukan bahwa menggunakan metode penyetel menambahkan hit yang signifikan pada kode. Sekarang diberikan ini adalah tes kinerja yang sangat spesifik di mana banyak aplikasi bahkan tidak akan mencapai ini. Tetapi jika Anda memiliki situs yang menangani 1000 / reqs / second dengan 1000 kelas yang digunakan dengan 1000 objek, Anda dapat melihat bagaimana hal ini dapat mempengaruhi kinerja.
<?php set_time_limit(500); class SomeClass { public $aaa; public $bbb; public $ccc; } class AnotherClass { } class SetterClass { public $aaa; public $bbb; public $ccc; public function setAAA() { $this->aaa = 'aaa'; } public function setBBB() { $this->bbb = 'bbb'; } public function setCCC() { $this->ccc = $this->aaa.$this->bbb; } } class SetterClassDefineReturn { public $aaa; public $bbb; public $ccc; public function setAAA():void { $this->aaa = 'aaa'; } public function setBBB():void { $this->bbb = 'bbb'; } public function setCCC():void { $this->ccc = $this->aaa.$this->bbb; } } class SetterClassSetFromParam { public $aaa; public $bbb; public $ccc; public function setAAA(string $val): void { $this->aaa = $val; } public function setBBB(string $val): void { $this->bbb = $val; } public function setCCC(string $val): void { $this->ccc = $val; } } class SetterClassSetKeyAndParam { public $aaa; public $bbb; public $ccc; public function set(string $key, string $val): void { $this->{$key} = $val; } } function p($i) { echo '<pre>'; print_r($i); echo '</pre>'; echo '<hr>'; } $t0 = microtime(true); $arraysOf=[]; $inicio=memory_get_usage(); for ($i=0; $i<1000; $i++) { $z = new SomeClass(); for ($j=0; $j<10000; $j++) { $z->aaa = 'aaa'; $z->bbb = 'bbb'; $z->ccc = $z->aaa.$z->bbb; } $arraysOf[]=$z; } $fin=memory_get_usage(); echo '<p>Time Taken (seconds): '.(microtime(true) - $t0).'</p>'; echo '<p>Memory: '.($fin-$inicio).'</p>'; p($z); $t0 = microtime(true); $arraysOf=[]; $inicio=memory_get_usage(); for ($i=0; $i<5000; $i++) { $z = new AnotherClass(); for ($j=0; $j<5000; $j++) { $z->aaa = 'aaa'; $z->bbb = 'bbb'; $z->ccc = $z->aaa.$z->bbb; } $arraysOf[]=$z; } $fin=memory_get_usage(); echo '<p>Time Taken (seconds): '.(microtime(true) - $t0).'</p>'; echo '<p>Memory: '.($fin-$inicio).'</p>'; p($z); $t0 = microtime(true); $arraysOf=[]; $inicio=memory_get_usage(); for ($i=0; $i<5000; $i++) { $z = new SetterClass(); for ($j=0; $j<5000; $j++) { $z->setAAA(); $z->setBBB(); $z->setCCC(); } $arraysOf[]=$z; } $fin=memory_get_usage(); echo '<p>Time Taken (seconds): '.(microtime(true) - $t0).'</p>'; echo '<p>Memory: '.($fin-$inicio).'</p>'; p($z); $t0 = microtime(true); $arraysOf=[]; $inicio=memory_get_usage(); for ($i=0; $i<5000; $i++) { $z = new SetterClassDefineReturn(); for ($j=0; $j<5000; $j++) { $z->setAAA(); $z->setBBB(); $z->setCCC(); } $arraysOf[]=$z; } $fin=memory_get_usage(); echo '<p>Time Taken (seconds): '.(microtime(true) - $t0).'</p>'; echo '<p>Memory: '.($fin-$inicio).'</p>'; p($z); $t0 = microtime(true); $arraysOf=[]; $inicio=memory_get_usage(); for ($i=0; $i<5000; $i++) { $z = new SetterClassSetFromParam(); for ($j=0; $j<5000; $j++) { $z->setAAA('aaa'); $z->setBBB('bbb'); $z->setCCC('aaabbb'); } $arraysOf[]=$z; } $fin=memory_get_usage(); echo '<p>Time Taken (seconds): '.(microtime(true) - $t0).'</p>'; echo '<p>Memory: '.($fin-$inicio).'</p>'; p($z); $t0 = microtime(true); $arraysOf=[]; $inicio=memory_get_usage(); for ($i=0; $i<5000; $i++) { $z = new SetterClassSetKeyAndParam(); for ($j=0; $j<5000; $j++) { $z->set('aaa', 'aaa'); $z->set('bbb', 'bbb'); $z->set('ccc', 'aaabbb'); } $arraysOf[]=$z; } $fin=memory_get_usage(); echo '<p>Time Taken (seconds): '.(microtime(true) - $t0).'</p>'; echo '<p>Memory: '.($fin-$inicio).'</p>'; p($z); $t0 = microtime(true); $arraysOf=[]; $inicio=memory_get_usage(); for ($i=0; $i<5000; $i++) { $z = new stdClass(); for ($j=0; $j<5000; $j++) { $z->aaa = 'aaa'; $z->bbb = 'bbb'; $z->ccc = $z->aaa.$z->bbb; } $arraysOf[]=$z; } $fin=memory_get_usage(); echo '<p>Time Taken (seconds): '.(microtime(true) - $t0).'</p>'; echo '<p>Memory: '.($fin-$inicio).'</p>'; p($z); $t0 = microtime(true); $arraysOf=[]; $inicio=memory_get_usage(); for ($i=0; $i<5000; $i++) { $z = []; for ($j=0; $j<5000; $j++) { $z['aaa'] = 'aaa'; $z['bbb'] = 'bbb'; $z['ccc'] = $z['aaa'].$z['bbb']; } $arraysOf[]=$z; } $fin=memory_get_usage(); echo '<p>Time Taken (seconds): '.(microtime(true) - $t0).'</p>'; echo '<p>Memory: '.($fin-$inicio).'</p>'; p($z);
Dan inilah hasilnya:
Time Taken (seconds): 3.9636149406433 Memory: 164920 SomeClass Object ( [aaa] => aaa [bbb] => bbb [ccc] => aaabbb ) ----- Time Taken (seconds): 10.872401237488 Memory: 2563136 AnotherClass Object ( [aaa] => aaa [bbb] => bbb [ccc] => aaabbb ) ---- Time Taken (seconds): 59.879059791565 Memory: 905848 SetterClass Object ( [aaa] => aaa [bbb] => bbb [ccc] => aaabbb ) ---- Time Taken (seconds): 60.484427213669 Memory: 905792 SetterClassDefineReturn Object ( [aaa] => aaa [bbb] => bbb [ccc] => aaabbb ) ---- Time Taken (seconds): 62.783381223679 Memory: 745792 SetterClassSetFromParam Object ( [aaa] => aaa [bbb] => bbb [ccc] => aaabbb ) ---- Time Taken (seconds): 72.155715942383 Memory: 745824 SetterClassSetKeyAndParam Object ( [aaa] => aaa [bbb] => bbb [ccc] => aaabbb ) ---- Time Taken (seconds): 11.212271928787 Memory: 2505824 stdClass Object ( [aaa] => aaa [bbb] => bbb [ccc] => aaabbb ) ---- Time Taken (seconds): 9.5637300014496 Memory: 2305848 Array ( [aaa] => aaa [bbb] => bbb [ccc] => aaabbb )
sumber
Jika Array dan Kelas memiliki kinerja yang sama, saya pikir menggunakan objek dari kelas yang telah ditentukan untuk menyimpan / meneruskan data bisnis akan membuat program kami lebih logis dan kode lebih mudah dibaca.
Saat ini, dengan ide modern seperti Eclipse, Netbean ... sangat mudah untuk mengetahui info apa yang dibawa suatu objek (dari kelas yang telah ditentukan) tetapi array tidak begitu
Misalnya: Dengan array
function registerCourse(array $student) { // Right here I don't know how a $student look like unless doing a print_r() or var_dump() .... }
Dengan objek
class Studen { private $_name, $_age; public function getAge() {} public function getName() {} .. } function registerCourse(Studen $student) { // Right here I just Ctrl+Space $student or click "Student" and I know I can get name or age from it ... }
sumber