بشكل عام، هناك ثلاث طرق لاجتياز المصفوفة، for، while، وforeach. أبسطها وأكثرها ملاءمة هو foreach. إذن ما هي الاختلافات في التشغيل والأداء بينهما؟ ما هي الطريقة الأفضل عادةً للاستخدام؟
دعونا أولاً نختبر الوقت الذي يستغرقه اجتياز مصفوفة أحادية البعد تحتوي على 50000 مشترك:
منصة الاختبار:
وحدة المعالجة المركزية: بي إم 725
الذاكرة: 512 م
القرص الصلب: 40 جيجا 5400 دورة في الدقيقة
نظام التشغيل: ويندوز إكس بي SP2
رمز اختبار
أباتشي 2.0.54 php5.0.4
:
<?php
/*
* @ المؤلف : ليلوف
* @ الصفحة الرئيسية: www.codesky.com
* @ البريد الإلكتروني: [email protected]
*
*/
$arr = array();
ل($i = 0; $i < 50000; $i++){
$arr[] = $i*rand(1000,9999);
}
الدالة GetRunTime()
{
list($usec,$sec)=explode(" ",microtime());
إرجاع ((تعويم)$usec+(float)$sec);
}
##########################################################################################################
$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();
while(list($key, $val) = every($arr)){
$str .= $val;
}
$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 as $key => $val){
$str .= $val;
}
$time_end = GetRunTime();
$time_used = $time_end - $time_start؛
echo "الوقت المستخدم في البحث:'.round($time_used, 7).'(s)<br><br>';
##############################
?>
نتائج الاختبار:
متوسط نتائج الاختبارات الثلاثة:
يتوافق مع، بينما، foreach على التوالي
0.1311650
0.1666853
0.1237440
بعد الاختبارات المتكررة، أظهرت النتائج أنه عند عبور نفس المصفوفة، يكون foreach هو الأسرع، والأبطأ هو while. foreach أسرع بحوالي 20٪ إلى 30٪ من الوقت. ثم قم بزيادة منخفض الصفيف إلى 500000 و5000000، وستكون نتائج الاختبار هي نفسها. ولكن من وجهة نظر مبدئية، تعمل foreach على نسخة من المصفوفة (عن طريق نسخ المصفوفة)، بينما تعمل عن طريق تحريك الفهرس الداخلي للمصفوفة بشكل عام، يُعتقد أن while يجب أن تكون أسرع من foreach (لأنه). يضع foreach أولاً المصفوفة التي تم نسخها، بينما يقوم بتحريك المؤشر الداخلي مباشرة)، ولكن النتيجة هي عكس ذلك تمامًا. يجب أن يكون السبب هو أن foreach هو تطبيق داخلي لـ PHP، في حين أن while هي بنية حلقة عامة.
لذلك، في التطبيقات العامة، أفضل استخدام نموذج foreach، وهو بسيط وفعال. ضمن PHP5، يمكن لـ foreach أيضًا اجتياز سمات الفصل الدراسي.