เปรียบเทียบความเร็วในการตรวจหาตัวแปรว่าง

การทดสอบฟังก์ชั่นจะช่วยให้เราเลือกใช้ฟังก์ชั่นให้เหมาะกับงานมากขึ้นครับ โดยฟังก์ชั่นแต่ละตัว ถึงแม้จะมีผลลัพท์เหมือนๆกัน แต่ก็อาจมีข้อแตกต่างด้านความเร็วได้ครับ

ในบทความนี้เป็นการทดสอบการเปรียบเทียบตัวแปรด้วย == และ === และ empty() ในการตรวจสอบว่าตัวแปรว่างหรือไม่ โดยมีการทดสอบทั้งกรณีที่ตัวแปรว่างเปล่า (ไม่มีข้อมูล) และหากตัวแปรไม่ว่างด้วย (มีข้อมูล)

ผลการทดสอบบน PHP 4 เวอร์ชั่นในเครื่องเดียวกัน

Current PHP version: 5.2.17                                                                                                                                                                                                                                                        
ไม่มีข้อมูลมีข้อมูล
==0.00189082622528080.0018590688705444
===0.00161331892013550.0011244058609009
empty0.00168253183364870.0016883373260498

Current PHP version: 5.4.45                                                                                                                                                                                                                                                        
ไม่มีข้อมูลมีข้อมูล
==0.000744473934173580.0011142015457153
===0.000957059860229490.00055713653564453
empty0.000607085227966310.00054726600646973

Current PHP version: 5.6.14                                                                                                                                                                                                                                                        
ไม่มีข้อมูลมีข้อมูล
==0.000721800327301030.0010463237762451
===0.000946307182312010.00053664445877075
empty0.000568222999572750.00052398443222046

Current PHP version: 7.1.0-dev                                                                                                                                                                                                                                                        
ไม่มีข้อมูลมีข้อมูล
==0.000317907333374020.0010286331176758
===0.000382506847381590.00038677453994751
empty0.000341248512268070.00036451816558838

ผมสรุปผลการทดสอบแบบนี้นะครับ
เครื่องหมาย == ใช้ทดสอบตัวแปรว่างได้เร็วกว่า ถ้าตัวแปรว่าง (ยกเว้น PHP5.2 ที่ให้ผลการทดสอบพอๆกัน)
เครื่องหมาย === ใช้ทดสอบตัวแปรไม่ว่างได้เร็วกว่า (ยกเว้น PHP7 ที่ให้ผลลัพท์พอๆกัน)
ฟังก์ชั่น empty() ใช้ทดสอบตัวแปรว่างเปล่า ได้ความเร็วพอๆกันทั้งกรณีทีตัวแปรว่างและไม่ว่าง (ผมให้คะแนนฟังก์ชั่นนี้ชนะเลิศนะ)

โค้ดที่ใช้ในการทดสอบ
// จำนวนครั้งการทดสอบ
$max = 10000;
// จำนวนรอบการทดสอบ ผลลัพท์เฉลี่ยจากค่านี้
$count = 20;
// แอเรย์เก็บผลลัพท์
$ret = array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
// ข้อมูล
$y = '';
$x = 'ตัวแปรที่มีข้อมูล';
for ($m = 0; $m < $count; $m++) {
    // ใช้งาน == เปรียบเทียบตัวแปรที่ไม่มีมีข้อมูล
    $start = microtime(true);
    for ($z = 0; $z < $max; $z++) {
        if ($y == '') {

        }
    }
    $ret[0] += microtime(true) - $start;

    // ใช้งาน === เปรียบเทียบตัวแปรที่ไม่มีมีข้อมูล
    $start = microtime(true);
    for ($z = 0; $z < $max; $z++) {
        if ($y === '') {

        }
    }
    $ret[1] += microtime(true) - $start;

    // ใช้งาน empty เปรียบเทียบตัวแปรที่ไม่มีมีข้อมูล
    $start = microtime(true);
    for ($z = 0; $z < $max; $z++) {
        if (empty($y)) {

        }
    }
    $ret[2] += microtime(true) - $start;

    // ใช้งาน == เปรียบเทียบตัวแปรที่มีข้อมูล
    $start = microtime(true);
    for ($z = 0; $z < $max; $z++) {
        if ($x == '') {

        }
    }
    $ret[4] += microtime(true) - $start;

    // ใช้งาน === เปรียบเทียบตัวแปรที่มีข้อมูล
    $start = microtime(true);
    for ($z = 0; $z < $max; $z++) {
        if ($x === '') {

        }
    }
    $ret[5] += microtime(true) - $start;

    // ใช้งาน empty เปรียบเทียบตัวแปรที่มีข้อมูล
    $start = microtime(true);
    for ($z = 0; $z < $max; $z++) {
        if (empty($x)) {

        }
    }
    $ret[6] += microtime(true) - $start;

    usleep(10240);
}
echo 'Current PHP version: '.phpversion().'<br>';
echo '<table border=solid width=400px>';
echo '<tr><th></th><th>ไม่มีข้อมูล</th><th>มีข้อมูล</th></tr>';
echo '<tr><th>==</th><td>'.($ret[0] / $count).'</td><td>'.($ret[4] / $count).'</td></tr>';
echo '<tr><th>===</th><td>'.($ret[1] / $count).'</td><td>'.($ret[5] / $count).'</td></tr>';
echo '<tr><th>empty</th><td>'.($ret[2] / $count).'</td><td>'.($ret[6] / $count).'</td></tr>';
echo '</table>';
ผู้เขียน Goragod โพสต์เมื่อ 08 ก.ค. 2558 เปิดดู 1,166 ป้ายกำกับ PHP Benchmark

เรื่องที่เกี่ยวข้อง

^