เปรียบเทียบการผสานข้อมูลที่เป็น object

การผสานข้อมูลที่เป็น Object ไม่มีฟังก์ชั่นที่ทำหน้าที่นี้โดยตรง แต่เราสามารถใช้ foreach ในการวนลูปเพื่อผสาน 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>';
ผู้เขียน goragod โพสต์เมื่อ 10 ธ.ค. 2558 เปิดดู 2,266 ป้ายกำกับ benchmark
^