A-AA+then

เป็นการทดสอบความเร็ว (benchmark) ในการอ่านค่าคีย์ของแอเรย์รายการแรกนะครับ โดยผมได้แบ่งการทดสอบออกเป็น 4 วิธี
  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)

Relate

^