PDA

View Full Version : حرفه ای: استنباط غلط از حلقه for - سرعت حلقه for بیشتر از حلقه foreach است !



abolfazl-z
شنبه 05 دی 1394, 20:34 عصر
سلام

سرعت حلقه for از حلقه foreach بیشتر می باشد یا حداقل آنقدری که فکر می کنیم تفاوت ندارند !

مثال :


<?php
#Copyright © http://barnamenevis.org/showthread.php?495885-PHP-Performance-%28%D8%A7%D9%81%D8%B2%D8%A7%DB%8C%D8%B4-%D8%B3%D8%B1%D8%B9%D8%AA-%D9%88-%D8%A8%D8%A7%D8%B2%D8%AF%D9%87%DB%8C%29&p=2216047&viewfull=1#post2216047
#Modified by abolfazl ziaratban
$elements = array();

////
// An array of 10,000 elements with random string values
////
for($i = 0; $i < 500000; $i++) {
$elements[] = (string)rand(10000000, 99999999);
}

$time_start = microtime(true);

////
// for test
////
for($i = 0; $i < count($elements); $i++)
$value = $elements[$i];

$time_end = microtime(true);
$for_time = $time_end - $time_start;

$time_start = microtime(true);

////
// foreach test
////
foreach($elements as $element)
$value = $element;

$time_end = microtime(true);
$foreach_time = $time_end - $time_start;

#For2
$time_start = microtime(true);
$count = count($elements);
for($i = 0; $i < $count; $i++)
$value = $elements[$i];
$time_end = microtime(true);
$for_time2 = $time_end - $time_start;

echo "For took: " . number_format($for_time * 1000, 3) . "ms <br>\n";
echo "Foreach took: " . number_format($foreach_time * 1000, 3) . "ms <br>\n";
echo "For2 took: " . number_format($for_time2 * 1000, 3) . "ms <br>\n";
?>


خروجی :

For took: 133.310ms
Foreach took: 60.811ms
For2 took: 55.676ms

خوب همانطور که مشاهده می کنید سرعت آخرین For از همه بیشتر است. (با نیم میلیون خانه آرایه)

چرا for اول سرعت اش به مراتب از for دوم کمتر است ؟
دلیل واضح است چرا که ساختار for از سه قسمت expression تشکیل شده است و قسمت اول یک بار در اولین اجرای for اجرا می شود, قسمت دوم و سوم مداوم با توجه به برقراری شرط در قسمت دوم اجرا می شوند ! یعنی در for اول نیم میلیون بار تابع count اجرا می شود ولی در for دوم از این کار جلوگیری شده است.