Kotchasan PHP Framework

ทำไมจึงต้อง benchmark โค้ด

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

ทำอย่างไรโค้ดถึงจะประมวลผลได้เร็วที่สุด

1.เขียนโค้ดให้สั้น ยิ่งสั้นลงเท่าไร ยิ่งทำให้โค้ดเร็วขึ้นเท่านั้น ยกตัวอย่าง จงเขียนโปรแกรมแสดงเลขคู่ 0 ถึง 100 ซึ่งบางคนอาจเขียนแบบนี้
for ($i = 0; $i <= 100; $i++) {
    if ($i % 2 == 0) {
        echo $i;
    }
}

และคนที่มีประสบการณ์มากกว่า อาจเขียนแบบนี้
for ($i = 0; $i <= 100; $i+=2) {
    echo $i;
}

จะเห็นว่าโค้ดด้านล่างจะสั้นกว่าอย่างเห็นได้ชัด และมันก็มีแนวโน้มที่จะเร็วกว่า

ถึงแม้เราจะเขียนโค้ดได้สั้นที่สุด แต่มันอาจจะไม่ได้หมายถึงว่ามันจะมีประสิทธิภาพมากกว่า สิ่งที่ควรทำในตอนนี้ไม่ใช่เชื่อไปซะทั้งหมด เราควรจะทดสอบด้วยตัวเองว่ามันเร็วกว่าจริงหรือไม่
// จำนวนรอบสูงสุด
$max = 1000;
// แสดงเลขคู่ 0 - 100 วิธีแรก
$start = microtime( true );
for ($n = 0; $n < $max; $n++) {
    for ($i = 0; $i <= 100; $i++) {
        if ($i % 2 == 0) {
            echo $i;
        }
    }
}
echo "<br>";
echo (microtime( true ) - $start)." ($i % 2)<br>";
// แสดงเลขคู่ 0 - 100 วิธีที่สอง
$start = microtime( true );
for ($n = 0; $n < $max; $n++) {
    for ($i = 0; $i <= 100; $i+=2) {
        echo $i;
    }
}
echo "<br>";
echo (microtime( true ) - $start)." ($i+=2)<br>";

ผลการทดสอบ
0.02341103553772 (101 % 2)
0.0076189041137695 (102+=2)

ดูเอาเองนะครับว่าอันไหนเร็วกว่ากัน และ เร็วกว่ากันมากน้อยแค่ไหน เพียงเท่านี้ เราก็สามารถเชื่่อได้สนิทใจแล้วว่า เราควรเลือกใช้วิธีไหนหรือเขียนโค้ดอย่างไรให้เร็วที่สุด

2.เลือกใช้วิธีการที่เหมาะสม ลองดูอีกสักตัวอย่างนะครับ ตัวอย่างนี้เป็นการเปรียบเทียบการใช้ฟังก์ชั่นของ PHP array_search() ในการค้นหาข้อมูลจาก Array เปรียบเทียบกับการค้นหาโดยไม่ใช้ฟังก์ชั่นข้างต้น
// จำนวนรอบสูงสุด
$max = 1000;
$datas = array('one', 'two', 'three', 'four', 'five');
$find = 'four';
// วิธีแรก ค้นหาโดยใช้ฟังก์ชั่นของ PHP
$start = microtime(true);
for ($n = 0; $n < $max; $n++) {
    $r = array_search($find, $datas);
}
echo "<br>";
echo (microtime(true) - $start)." ($r)<br>";
// วิธีที่สอง วนลูปค้นหาข้อมูลด้วยวิธีแบบบ้านๆ
$start = microtime(true);
for ($n = 0; $n < $max; $n++) {
    foreach ($datas as $key => $value) {
        if ($value == $find) {
            break;
        }
    }
}
echo "<br>";
echo (microtime(true) - $start)." ($key)<br>";

ผลลัพท์
0.00037479400634766 (3)
0.00027179718017578 (3)

สังเกตุมั้ยครับว่าฟังก์ชั่นของ PHP ไม่ได้เร็วที่สุด เราสามารถเขียนโค้ดแบบบ้านๆ เพื่อเร่งความเร็วของโค้ดเราได้อีก และถ้าเราไม่เคยทดสอบด้วยตัวเองเลย เราจะไม่มีทางรู้ว่าเราจะเขียนโค้ดอย่างไรดีให้มีประสิทธิภาพสูงที่สุด
หลายคนอาจสงสัยว่า ฟังก์ชั่นของ PHP เองน่าจะมีประสิทธิภาพมากที่สุด แต่ในความเป็นจริงแล้ว ฟังก์ชั่นของ PHP เองจะต้องมีการทดสอบตัวแปรก่อนที่จะประมวลผลหรือส่งข้อผิดพลาดกลับมา ซึ่งเป็นสาเหตุให้การเขียนโค้ดแบบธรรมดาสามารถทำเวลาได้ดีกว่า
3.benchmark สิครับ รออะไรอยู่ ผมก็ทำให้เห็นตามด้านบนแล้วว่าความแตกต่างในการเขียนโค้ดแม้เพียงเล็กๆน้อยๆถ้ารวมกันก็มีผลมากโขอยู่ โค้ดของเราไม่ใช่แค่ "Hello World" แต่อาจมีฟังก์ชั่นหรือโค้ดจำนวนมากนับพันบรรทัดอยู่ในนั้นรอให้เราปรับปรุงอยู่

บางคนอาจแย้งว่า เวลามันต่างกันนิดเดียวเอง แต่จำไว้เถอะครับว่า ไอ้เล็กๆน้อยๆสำหรับคอมพิวเตอร์แล้วถ้ารวมกันเป็นระบบใหญ่ๆขึ้นมันย่อมจะมากขึ้นอย่างเห็นได้ชัด (คอมพิวเตอร์ทำงานกับเวลาเล็กๆน้อยเหล่านี้แหละครับ) ลองคำนวณดูนะครับว่า ถ้าโค้ดประมวลผลโดยใช้เวลาหนึ่งวินาที ในหนึ่งวัน เว็บของเราจะรับคนได้สูงสุด 86,400 คน (60 วินาที * 60 นาที * 24 ชั่วโมง) และหากเราสามารถลดเวลาตรงนี้ลงได้ เว็บไซต์ของเราก็จะสามารถรองรับผู้เยี่ยมชมได้มากขึ้น