GORAGOD.com

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

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

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

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

Current PHP version: 5.2.17
ไม่มีข้อมูล มีข้อมูล
== 0.0018908262252808 0.0018590688705444
=== 0.0016133189201355 0.0011244058609009
empty 0.0016825318336487 0.0016883373260498

Current PHP version: 5.4.45
ไม่มีข้อมูล มีข้อมูล
== 0.00074447393417358 0.0011142015457153
=== 0.00095705986022949 0.00055713653564453
empty 0.00060708522796631 0.00054726600646973

Current PHP version: 5.6.14
ไม่มีข้อมูล มีข้อมูล
== 0.00072180032730103 0.0010463237762451
=== 0.00094630718231201 0.00053664445877075
empty 0.00056822299957275 0.00052398443222046

Current PHP version: 7.1.0-dev
ไม่มีข้อมูล มีข้อมูล
== 0.00031790733337402 0.0010286331176758
=== 0.00038250684738159 0.00038677453994751
empty 0.00034124851226807 0.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>';