เปรียบเทียบความเร็วในการอ่านค่าคีย์ของแอเรย์รายการแรก
เป็นการทดสอบความเร็ว (benchmark) ในการอ่านค่าคีย์ของแอเรย์รายการแรกนะครับ โดยผมได้แบ่งการทดสอบออกเป็น 4 วิธี
1. วิธีแรก เป็นการใช้ฟังก์ชั่นทั่วไปของแอเรย์
2. วิธีที่สอง จริงๆก็ไม่ต่างจากวิธีแรกครับ แต่ผมหดมันให้เหลือแค่บรรทัดเดียวเพื่อดูความแตกต่าง
3. วิธีที่สาม เป็นการใช้ฟังก์ชั่นทั่วไปของแอเรย์อีกวิธี
4. วิธีที่สี่ ใช้การวนลูป
โค้ดที่ใช้ในการทดสอบ (ตัวอย่างนี้ทดสอบบน PHP 5.6)
ผลการทดสอบ
จากผลการทดสอบ การวนลูป (วิธีที่สี่) เร็วกว่าวิธีอื่นๆเกือบสิบเท่าเชียวครับ และมีข้อสังเกตุ คือ ในวิธีที่สอง การเขียนแบบบรรทัดเดียวยังเร็วกว่าการเขียนแบบปกติอีก (จริงๆ แบบแรกมันช้ากว่าเพราะต้องมีการถ่ายตัวแปรจากฟังก์ชั่นไปยังตัวแปร)
ผมได้ทำการทดสอบเพิ่มเติมโดยการเพิ่มจำนวนสมาชิกของ Array เป็นพันรายการ ด้วยโค้ดนี้
ผลการทดสอบ
จากผลการทดสอบจะพบว่า วิธีแรกและวิธีที่สองยิ่งช้าลงอย่างเห็นได้ชัด เนื่องจากต้องเสียเวลาในการอ่านคีย์ออกมาก่อน แต่วิธีที่สามและวิธีที่สี่ไม่พบความแตกต่างหากสมาชิกเพิ่มขึ้นครับ
ทำนองเดียวกันนะครับ ในการอ่านค่า value ของแอเรย์ตัวแรกก็ให้ผลลัพท์ในทำนองเดียวกัน คือ การใช้ foreach ยังเร็วกว่าการใช้ฟังก์ชั่นของ PHP
1. วิธีแรก ใช้ฟังก์ชั่นของ PHP
2. วิธีที่สอง ใช้ foreach
ผลการทดสอบ
1. วิธีแรก เป็นการใช้ฟังก์ชั่นทั่วไปของแอเรย์
$keys = array_keys($a);
$r = reset($keys);
2. วิธีที่สอง จริงๆก็ไม่ต่างจากวิธีแรกครับ แต่ผมหดมันให้เหลือแค่บรรทัดเดียวเพื่อดูความแตกต่าง
$r = reset((array_keys($a)));
3. วิธีที่สาม เป็นการใช้ฟังก์ชั่นทั่วไปของแอเรย์อีกวิธี
reset($a);
$r = key($a);
4. วิธีที่สี่ ใช้การวนลูป
foreach ($a as $key => $value) {
$r = $key;
break;
}
โค้ดที่ใช้ในการทดสอบ (ตัวอย่างนี้ทดสอบบน PHP 5.6)
// จำนวนครั้งการทดสอบ
$max = 100000;
// ข้อมูลตัวอย่าง
$a = array(1 => 'one', 2 => 'two', 3 => 'three', 4 => 'four', 5 => 'five');
// test 1
$start = microtime(true);
for ($z = 0; $z < $max; $z++) {
$keys = array_keys($a);
$r = reset($keys);
}
echo '<br>'.( microtime(true) - $start)."($r)";
// test 2
$start = microtime(true);
for ($z = 0; $z < $max; $z++) {
$r = reset((array_keys($a)));
}
echo '<br>'.( microtime(true) - $start)."($r)";
// test 3
$start = microtime(true);
for ($z = 0; $z < $max; $z++) {
reset($a);
$r = key($a);
}
echo '<br>'.( microtime(true) - $start)."($r)";
// test 4
$start = microtime(true);
for ($z = 0; $z < $max; $z++) {
foreach ($a as $key => $value) {
$r = $key;
break;
}
}
echo '<br>'.( microtime(true) - $start)."($r)";
ผลการทดสอบ
0.11467790603638(1)
0.099647998809814(1)
0.078979969024658(1)
0.019246816635132(1)
จากผลการทดสอบ การวนลูป (วิธีที่สี่) เร็วกว่าวิธีอื่นๆเกือบสิบเท่าเชียวครับ และมีข้อสังเกตุ คือ ในวิธีที่สอง การเขียนแบบบรรทัดเดียวยังเร็วกว่าการเขียนแบบปกติอีก (จริงๆ แบบแรกมันช้ากว่าเพราะต้องมีการถ่ายตัวแปรจากฟังก์ชั่นไปยังตัวแปร)
ผมได้ทำการทดสอบเพิ่มเติมโดยการเพิ่มจำนวนสมาชิกของ Array เป็นพันรายการ ด้วยโค้ดนี้
for ($i = 1; $i < 1000; $i++) {
$a[rand()] = rand();
}
ผลการทดสอบ
3.3502490520477(1973343310)
3.2899429798126(1973343310)
0.074076890945435(1973343310)
0.019939184188843(1973343310)
จากผลการทดสอบจะพบว่า วิธีแรกและวิธีที่สองยิ่งช้าลงอย่างเห็นได้ชัด เนื่องจากต้องเสียเวลาในการอ่านคีย์ออกมาก่อน แต่วิธีที่สามและวิธีที่สี่ไม่พบความแตกต่างหากสมาชิกเพิ่มขึ้นครับ
ทำนองเดียวกันนะครับ ในการอ่านค่า value ของแอเรย์ตัวแรกก็ให้ผลลัพท์ในทำนองเดียวกัน คือ การใช้ foreach ยังเร็วกว่าการใช้ฟังก์ชั่นของ PHP
1. วิธีแรก ใช้ฟังก์ชั่นของ PHP
$r = reset($a);
2. วิธีที่สอง ใช้ foreach
foreach ($a as $key => $value) {
$r = $value;
break;
}
ผลการทดสอบ
0.041718006134033(one)
0.018127202987671(one)