Я обнаружил, что PHPBench не очень хороший источник для нетривиальных эталонных тестов. Поэтому, если вы действительно не заинтересованы в запуске for(....);
, не будет корректно показывать, какой синтаксис будет быстрее. Я собрал простой тест, чтобы показать, что foreach на самом деле самый быстрый, когда вы используете как ключ, так и значение во время итерации.
Очень важно заставить PHP читать значения из цикла итерации, иначе он сделает все возможное, чтобы их оптимизировать. В приведенном ниже примере я использую функцию doNothing
, чтобы заставить PHP каждый раз вычислять ключ и значение. Использование doNothing приведет к накладным расходам, которые будут применяться к каждому циклу, но они будут одинаковыми для каждого цикла, так как количество вызовов будет одинаковым.
Я не был так удивлен, что foreach
вышел сверху, так как это языковая конструкция для итерации словаря.
$array = range(0, 1000000);
function doNothing($value, $key) {;}
$t1_start = microtime(true);
foreach($array as $key => $value) {
doNothing($value, $key);
}
$t1_end = microtime(true);
$t2_start = microtime(true);
$array_size = count($array);
for($key = 0; $key < $array_size; $key++) {
doNothing($array[$key], $key);
}
$t2_end = microtime(true);
//suggestion from PHPBench as the "fastest" way to iterate an array
$t3_start = microtime(true);
$key = array_keys($array);
$size = sizeOf($key);
for($i=0; $i < $size; $i++) {
doNothing($key[$i], $array[$key[$i]]);
}
$t3_end = microtime(true);
$t4_start = microtime(true);
array_walk($array, "doNothing");
$t4_end = microtime(true);
print
"Test 1 ".($t1_end - $t1_start)."\n". //Test 1 0.342370986938
"Test 2 ".($t2_end - $t2_start)."\n". //Test 2 0.369848966599
"Test 3 ".($t3_end - $t3_start)."\n". //Test 3 0.78616809845
"Test 4 ".($t4_end - $t4_start)."\n"; //Test 4 0.542922019958
Edit: Я использую PHP 5.3 на 64-разрядные Mac OSX 10.6
Это немного странно, потому что я получаю значения в 10 раз ниже: '0.043029069900513'. Вы знаете, почему это может произойти? Это PHP 5.4.3. И если я запустил это только для одного «foreach», а не для моего более длинного скрипта, то это: «6.4849853515625E-5' – Atadj
Они, кажется, находятся в правом фойе для меня: http: //codepad.viper-7. ком/b1gHRC. Foreach все еще остается явным победителем. –
Да, foreach - победитель, но мне интересно, почему этот сайт показывает «0.0497624» и мой сайт, с точно таким же сценарием показывает «0.0000871». – Atadj