Может быть, это связано с тем, что foreach работает с копией массива?
Или, может быть, это связано с тем, что при цикле с foreach на каждой итерации указатель внутреннего массива изменяется, чтобы указывать на следующий элемент?
Цитирование соответствующей части справочной страницы foreach
:
Примечание. Если на массив не ссылаются,
foreach работает с копией
указанный массив, а не массив
сам. foreach имеет некоторые побочные эффекты
на указатель массива.
Насколько я могу судить, третий тест, на который вы ссылались, не выполняет ни одну из этих двух вещей - что означает, что оба теста не делают одно и то же - что означает, что вы не сравниваете два способа написания одного и того же кода. .
(Я бы также сказал, что такого рода микрооптимизация вообще не будет иметь значения в реальном приложении - но я думаю, вы уже это знаете, и просто спросили из любопытства)
Есть также одна вещь, которая не подходит в этом тесте: тест проводится только один раз; для «лучшего» теста, возможно, было бы полезно протестировать все эти тесты более одного раза - с временными интервалами порядка 100 микросекунд, не так уж и много, чтобы сделать огромную разницу.
(Учитывая, что первый тест варьируется от 300% до 500% при нескольких обновлениях ...)
Для тех, кто не хочет нажимать, вот первый тест (я получил 3xx%, 443% и 529%) :
foreach($aHash as $key=>$val) {
$aHash[$key] .= "a";
}
И третий (100%) :
$key = array_keys($aHash);
$size = sizeOf($key);
for ($i=0; $i<$size; $i++) {
$aHash[$key[$i]] .= "a";
}