ทดสอบการตรวจสอบ ค่าภายใน loop ของ PHP
วันที่ 2 ก.ค. 52 + 02:51.45 , กลุ่ม PHP , ป้าย get, loop, php, set
อันเนื่องจากนั่งปั่นงานอยู่เพลินๆ ผมก็นั่งไตร่ตรองโค้ดของตัวเองว่า มันได้ประสิทธิภาพสูงสุดรึยังหว่า (สูงสุดเท่าที่ปัญญาจะพาไป)
ในสคริปที่กำลังนั่งๆ ปั่นอยู่ มันมีการตรวจสอบค่า และเซ็ตค่าใหม่ ภายใน loop อยู่ในปริมาณที่เยอะมาก ผมคิดว่าถ้าเขียนถูกวิธี น่าจะทำให้เพิ่มความเร็วในการประมวลผลได้แหงๆ
ผมก็เลยลองเทสสคริป ด้วยเงื่อนไขที่ว่า ด้วย loop แบบ 1 ล้านครั้ง ในสองเหตุการณ์คือ
ฟังแล้วอาจจะงง ดูตัวอย่างสคริปดีกว่า
แบบที่ 1
แบบนี้คือ จะมีแค่รอบแรกเท่านั้น ที่จะมีการเปลี่ยนแปลงค่าตัวแปล $is_data อีก 999,999 รอบที่เหลือ จะเป็นการเช็คด้วย if แล้วหลุดไป เท่านั้น ไม่มีการเปลี่ยนค่าในตัวแปล แต่อย่างใด
แบบที่ 2
แบบนี้ จะเป็นแบบที่ ไม่ต้องตรวจสอบเงื่อนไขใดๆ ทั้งสิ้น ทุก 1 ล้านรอบ จะมีการเซ็ตค่าให้ตัวแปล $is_data ให้เป็น true ทุกครั้ง
แล้วผลมันเป็นยังไงล่ะ
แต่น แต่น แต้นนนนนน ผลได้เป็นแบบนี้ครับ
สรุปคือ แบบที่ 2 ทำงานได้เร็วกว่า ประมาณ 10%-20% ... อ่าว แล้วปัญหาอยู่ตรงไหนล่ะ ...
คือมันตรงกันข้ามกะแบบที่ผมคิดไว้เลย เพราะ ตามหลักแล้ว การอ่านใช้เวลาน้อยกว่า การเขียนแน่ๆ อยู่แล้ว ... ดูจากโค้ดแล้ว แบบที่หนึ่ง จะใช้วิธีอ่านอย่างเดียว (เขียนรอบแรกรอบเดียว) ซึ่ง แบบที่สอง มันเป็นแบบที่เขียนค่าทุกครั้ง
แล้วทำไมแบบที่สองมันเร็วกว่าล่ะ ?? ... ผมก็เลย ลองวิธีใหม่ สร้างแบบที่ 3 ขึ้นมา ด้วยคำสั่งแบบนี้
แบบที่ 3
แบบนี้ต่างจากแบบที่สองยังไงล่ะ ... ที่ต่างกันคือ แบบที่สองจะเป็นการเซ็ตค่าเดิม ซ้ำๆ ลงไปทุกรอบ แต่แบบที่ 3 นี้ จะเป็นการ สลับค่าไปมาๆ เรื่อยๆ ทุกรอบ ... ซึ่งหมายความว่า การเขียนข้อมูลแต่ละครั้ง จะไม่ซ้ำค่าเดิมที่มีอยู่นั่นเอง ... แล้วผล เป็นไงล่ะ
อ่าวเฮ่ย!! แล้วทำไม มันยังเร็วกว่า if อีกล่ะเนี่ย เร็วกว่าอยู่หน่อยนึง ... ผมลองทดสอบหลายรอบแล้ว มันจะเร็วกว่าอยู่หน่อย (มีบางรอบเท่านั้นที่ แบบที่ 3 ช้ากว่า แบบที่ 1 แต่ส่วนใหญ่ จะเร็วกว่า)
สรุป PHP เซ็ตค่า เร็วกว่า เก็ตค่า
ทำไมกันหว่า ... สงสัยจะต้องมีเรื่องต่อไปคือ "กระบวนการ set get ของ PHP ทำงานอย่างไร" ออกมาต่อแหงๆ แต่รอให้ว่างๆ ก่อนแล้วกัน ค่อยไปตามรอยแบบกบนอกกะลา ว่าทำไม ยังไง
ในสคริปที่กำลังนั่งๆ ปั่นอยู่ มันมีการตรวจสอบค่า และเซ็ตค่าใหม่ ภายใน loop อยู่ในปริมาณที่เยอะมาก ผมคิดว่าถ้าเขียนถูกวิธี น่าจะทำให้เพิ่มความเร็วในการประมวลผลได้แหงๆ
ผมก็เลยลองเทสสคริป ด้วยเงื่อนไขที่ว่า ด้วย loop แบบ 1 ล้านครั้ง ในสองเหตุการณ์คือ
- ให้ตรวจสอบด้วย if ก่อน ถ้าไม่เข้าเงื่อนไขให้เซ็ตค่าให้ถูกเงื่อนไข
- เซ็ตไปทั้งอย่างงั้น ดุ้นๆ เลย
ฟังแล้วอาจจะงง ดูตัวอย่างสคริปดีกว่า
แบบที่ 1
list($usec, $sec) = explode(" ", microtime());
$__start = ((float)$usec + (float)$sec);
$is_data = false;
for($cx = 0; $cx < 1000000; $cx++)
{
if(!$is_data)
$is_data = true;
}
list($usec, $sec) = explode(" ", microtime());
$__end = ((float)$usec + (float)$sec);
echo number_format($__end - $__start, 10);แบบนี้คือ จะมีแค่รอบแรกเท่านั้น ที่จะมีการเปลี่ยนแปลงค่าตัวแปล $is_data อีก 999,999 รอบที่เหลือ จะเป็นการเช็คด้วย if แล้วหลุดไป เท่านั้น ไม่มีการเปลี่ยนค่าในตัวแปล แต่อย่างใด
แบบที่ 2
list($usec, $sec) = explode(" ", microtime());
$__start = ((float)$usec + (float)$sec);
$is_data = false;
for($cx = 0; $cx < 1000000; $cx++)
{
$is_data = true;
}
list($usec, $sec) = explode(" ", microtime());
$__end = ((float)$usec + (float)$sec);
echo number_format($__end - $__start, 10);แบบนี้ จะเป็นแบบที่ ไม่ต้องตรวจสอบเงื่อนไขใดๆ ทั้งสิ้น ทุก 1 ล้านรอบ จะมีการเซ็ตค่าให้ตัวแปล $is_data ให้เป็น true ทุกครั้ง
แล้วผลมันเป็นยังไงล่ะ
แต่น แต่น แต้นนนนนน ผลได้เป็นแบบนี้ครับ
- แบบที่ 1 ทำเวลาได้ ประมาณ ~0.125271 วินาที
- แบบที่ 2 ทำเวลาได้ ประมาณ ~0.107799 วินาที
สรุปคือ แบบที่ 2 ทำงานได้เร็วกว่า ประมาณ 10%-20% ... อ่าว แล้วปัญหาอยู่ตรงไหนล่ะ ...
คือมันตรงกันข้ามกะแบบที่ผมคิดไว้เลย เพราะ ตามหลักแล้ว การอ่านใช้เวลาน้อยกว่า การเขียนแน่ๆ อยู่แล้ว ... ดูจากโค้ดแล้ว แบบที่หนึ่ง จะใช้วิธีอ่านอย่างเดียว (เขียนรอบแรกรอบเดียว) ซึ่ง แบบที่สอง มันเป็นแบบที่เขียนค่าทุกครั้ง
แล้วทำไมแบบที่สองมันเร็วกว่าล่ะ ?? ... ผมก็เลย ลองวิธีใหม่ สร้างแบบที่ 3 ขึ้นมา ด้วยคำสั่งแบบนี้
แบบที่ 3
list($usec, $sec) = explode(" ", microtime());
$__start = ((float)$usec + (float)$sec);
$is_data = true;
for($cx = 0; $cx < 1000000; $cx++)
{
$is_data = !$is_data;
}
list($usec, $sec) = explode(" ", microtime());
$__end = ((float)$usec + (float)$sec);
echo number_format($__end - $__start, 10);แบบนี้ต่างจากแบบที่สองยังไงล่ะ ... ที่ต่างกันคือ แบบที่สองจะเป็นการเซ็ตค่าเดิม ซ้ำๆ ลงไปทุกรอบ แต่แบบที่ 3 นี้ จะเป็นการ สลับค่าไปมาๆ เรื่อยๆ ทุกรอบ ... ซึ่งหมายความว่า การเขียนข้อมูลแต่ละครั้ง จะไม่ซ้ำค่าเดิมที่มีอยู่นั่นเอง ... แล้วผล เป็นไงล่ะ
- แบบที่ 3 ทำเวลาได้ ประมาณ ~0.121049 วินาที
อ่าวเฮ่ย!! แล้วทำไม มันยังเร็วกว่า if อีกล่ะเนี่ย เร็วกว่าอยู่หน่อยนึง ... ผมลองทดสอบหลายรอบแล้ว มันจะเร็วกว่าอยู่หน่อย (มีบางรอบเท่านั้นที่ แบบที่ 3 ช้ากว่า แบบที่ 1 แต่ส่วนใหญ่ จะเร็วกว่า)
สรุป PHP เซ็ตค่า เร็วกว่า เก็ตค่า
ทำไมกันหว่า ... สงสัยจะต้องมีเรื่องต่อไปคือ "กระบวนการ set get ของ PHP ทำงานอย่างไร" ออกมาต่อแหงๆ แต่รอให้ว่างๆ ก่อนแล้วกัน ค่อยไปตามรอยแบบกบนอกกะลา ว่าทำไม ยังไง

ไม่สามารถแสดงความคิดเห็นได้ จำเป็นต้อง เข้าระบบสมาชิก ก่อน หรือ สมัครสมาชิกใหม่