โดยทั่วไป มีสามวิธีในการสำรวจอาร์เรย์ for, while และ foreach วิธีที่ง่ายและสะดวกที่สุดคือ foreach แล้วอะไรคือความแตกต่างในการทำงานและประสิทธิภาพระหว่างพวกเขา?
ก่อนอื่นให้เราทดสอบเวลาที่ใช้ในการสำรวจอาร์เรย์หนึ่งมิติด้วยตัวห้อย 50,000 ตัว:
แพลตฟอร์มทดสอบ:
ซีพียู: PM725
หน่วยความจำ: 512M
ฮาร์ดไดรฟ์: 40G 5400 รอบต่อนาที
ระบบปฏิบัติการ: Windows XP SP2
รหัสทดสอบ
apache 2.0.54 php5.0.4
:
<?php
-
* @ผู้เขียน: ลิลอฟ
* @ หน้าแรก: www.codesky.com
*@อีเมล์: [email protected]
-
*/
$arr = array();
สำหรับ($i = 0; $i < 50,000; $i++){
$arr[] = $i*แรนด์(1,000,9999);
}
ฟังก์ชัน GetRunTime()
-
รายการ($usec,$วินาที)=ระเบิด(" ",ไมโครไทม์());
กลับ ((ลอย)$usec+(ลอย)$วินาที);
-
-
$time_start = GetRunTime();
for($i = 0; $i < count($arr); $i++){
$str .= $arr[$i];
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo 'เวลาที่ใช้สำหรับ:'.round($time_used, 7).'(s)<br><br>';
unset($str, $time_start, $time_end, $time_used);
-
$time_start = GetRunTime();
ในขณะที่(รายการ($key, $val) = แต่ละ($arr)){
$str .= $วาล;
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo 'ใช้เวลาในขณะที่:'.round($time_used, 7).'(s)<br><br>';
unset($str, $key, $val, $time_start, $time_end, $time_used);
-
$time_start = GetRunTime();
foreach($arr เป็น $key => $val){
$str .= $วาล;
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start;
echo 'เวลาที่ใช้สำหรับ foreach:'.round($time_used, 7).'(s)<br><br>';
#####################################
?>
ผลการทดสอบ:
เฉลี่ยผลการทดสอบสามรายการ:
สอดคล้องกับ for, while, foreach ตามลำดับ
0.1311650
0.1666853
0.1237440
หลังจากการทดสอบซ้ำแล้วซ้ำอีก ผลลัพธ์แสดงให้เห็นว่าสำหรับการเคลื่อนที่ในอาร์เรย์เดียวกัน foreach จะเร็วที่สุด และช้าที่สุดคือ while เร็วขึ้นประมาณ 20% ~ 30% เมื่อเทียบกับในขณะนั้น จากนั้นเพิ่มตัวห้อยอาร์เรย์เป็น 500000 และ 5000000 และผลการทดสอบก็เหมือนกัน แต่จากมุมมองหลักการ foreach ดำเนินการกับสำเนาของอาร์เรย์ (โดยการคัดลอกอาร์เรย์) ในขณะที่ดำเนินการโดยการย้ายดัชนีภายในของอาร์เรย์ โดยทั่วไปเชื่อกันว่า while ควรจะเร็วกว่า foreach (เพราะว่า foreach อันดับแรกที่อาร์เรย์จะถูกคัดลอกในขณะที่ในขณะที่ย้ายตัวชี้ภายในโดยตรง) แต่ผลลัพธ์กลับตรงกันข้าม เหตุผลควรเป็นเพราะ foreach เป็นการใช้งาน PHP ภายใน ในขณะที่ while เป็นโครงสร้างลูปทั่วไป
ดังนั้นในการใช้งานทั่วไป ฉันชอบใช้แบบฟอร์ม foreach ซึ่งเรียบง่ายและมีประสิทธิภาพ ภายใต้ PHP5 foreach ยังสามารถสำรวจคุณสมบัติของคลาสได้