เปรียบเทียบการผสานข้อมูลที่เป็น object
เรามาลองดูผลการทดสอบการผสาน Object กันสองเงื่อนไข
เงื่อนไขแรก ให้ ข้อมูลตั้งต้นเป็น object และ ให้ข้อมูลที่ต้องการนำมารวมเป็น array
$a = (object)array(1 => 'one', 2 => 'two', 3 => 'three', 4 => 'four', 5 => 'five');
$b = array(6 => 'six', 7 => 'seven', 8 => 'eight', 9 => 'nine', 0 => 'zero');
foreach ($b as $k => $v) {
$a->$k = $v;
}
เงื่อนไขที่สอง ให้ข้อมูลทั้งสองเป็น object ทั้งคู่
$a = (object)array(1 => 'one', 2 => 'two', 3 => 'three', 4 => 'four', 5 => 'five');
$b = (object)array(6 => 'six', 7 => 'seven', 8 => 'eight', 9 => 'nine', 0 => 'zero');
foreach ($b as $k => $v) {
$a->$k = $v;
}
ผมมีผลการทดสอบบน PHP 4 เวอร์ชั่นบนเครื่องเดียวมาฝาก
Current PHP version: 5.2.17
0.0025666832923889 (object + array)
0.0033406615257263 (object + object)
Current PHP version: 5.4.45
0.0025673985481262 (object + array)
0.0027241468429565 (object + object)
Current PHP version: 5.6.14
0.0022830128669739 (object + array)
0.0023442983627319 (object + object)
Current PHP version: 7.1.0-dev
0.00078974962234497 (object + array)
0.0010856032371521 (object + object)
โค้ดที่ใช้ในการทดสอบ
<?php
// จำนวนครั้งการทดสอบ
$max = 1000;
// จำนวนรอบการทดสอบ ผลลัพท์เฉลี่ยจากค่านี้
$count = 20;
// แอเรย์เก็บผลลัพท์
$ret = array(0, 0);
for ($m = 0; $m < $count; $m++) {
// test 1
$a = (object)array(1 => 'one', 2 => 'two', 3 => 'three', 4 => 'four', 5 => 'five');
$b = array(6 => 'six', 7 => 'seven', 8 => 'eight', 9 => 'nine', 0 => 'zero');
$start = microtime(true);
for ($z = 0; $z < $max; $z++) {
foreach ($b as $k => $v) {
$a->$k = $v;
}
}
$ret[0] += microtime(true) - $start;
// test 2
$a = (object)array(1 => 'one', 2 => 'two', 3 => 'three', 4 => 'four', 5 => 'five');
$b = (object)array(6 => 'six', 7 => 'seven', 8 => 'eight', 9 => 'nine', 0 => 'zero');
$start = microtime(true);
for ($z = 0; $z < $max; $z++) {
foreach ($b as $k => $v) {
$a->$k = $v;
}
}
$ret[1] += microtime(true) - $start;
sleep(1);
}
echo 'Current PHP version: '.phpversion().'<br>';
echo ($ret[0] / $count).' (object + array)<br>';
echo ($ret[1] / $count).' (object + object)<br>';