![]() หมวดหมู่
|
ทดสอบการตรวจสอบ ค่าภายใน loop ของ PHP
วันที่
2 ก.ค. 52 + 02:51.45
ความคิดเห็น
0
กลุ่ม
PHP
อันเนื่องจากนั่งปั่นงานอยู่เพลินๆ ผมก็นั่งไตร่ตรองโค้ดของตัวเองว่า มันได้ประสิทธิภาพสูงสุดรึยังหว่า (สูงสุดเท่าที่ปัญญาจะพาไป)
ในสคริปที่กำลังนั่งๆ ปั่นอยู่ มันมีการตรวจสอบค่า และเซ็ตค่าใหม่ ภายใน loop อยู่ในปริมาณที่เยอะมาก ผมคิดว่าถ้าเขียนถูกวิธี น่าจะทำให้เพิ่มความเร็วในการประมวลผลได้แหงๆ ผมก็เลยลองเทสสคริป ด้วยเงื่อนไขที่ว่า ด้วย loop แบบ 1 ล้านครั้ง ในสองเหตุการณ์คือ
ฟังแล้วอาจจะงง ดูตัวอย่างสคริปดีกว่า แบบที่ 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 ทุกครั้ง แล้วผลมันเป็นยังไงล่ะ แต่น แต่น แต้นนนนนน ผลได้เป็นแบบนี้ครับ
สรุปคือ แบบที่ 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 นี้ จะเป็นการ สลับค่าไปมาๆ เรื่อยๆ ทุกรอบ ... ซึ่งหมายความว่า การเขียนข้อมูลแต่ละครั้ง จะไม่ซ้ำค่าเดิมที่มีอยู่นั่นเอง ... แล้วผล เป็นไงล่ะ
อ่าวเฮ่ย!! แล้วทำไม มันยังเร็วกว่า if อีกล่ะเนี่ย เร็วกว่าอยู่หน่อยนึง ... ผมลองทดสอบหลายรอบแล้ว มันจะเร็วกว่าอยู่หน่อย (มีบางรอบเท่านั้นที่ แบบที่ 3 ช้ากว่า แบบที่ 1 แต่ส่วนใหญ่ จะเร็วกว่า) สรุป PHP เซ็ตค่า เร็วกว่า เก็ตค่า ทำไมกันหว่า ... สงสัยจะต้องมีเรื่องต่อไปคือ "กระบวนการ set get ของ PHP ทำงานอย่างไร" ออกมาต่อแหงๆ แต่รอให้ว่างๆ ก่อนแล้วกัน ค่อยไปตามรอยแบบกบนอกกะลา ว่าทำไม ยังไง
|
ขับเคลื่อนโดย un-no Engine 2.1.2 © ลิขสิทธ์โดย บริษัท อันโน คอร์ปอเรชั่น จำกัด [ แผนที่เว็บไซต์ ]
แก้ไขล่าสุด: 2009-11-15 00:40:43, หมายเลขเซสชั่น: dd156a36974805fc919022490cc8b214, ใช้เวลาสร้าง: 0.011523962 วินาที