Информация, доступная сейчас о них в сети, сбивает с толку. Многие говорят, что foreach — это плохо, но технически он должен быть быстрее, поскольку предполагается упростить запись обхода массива с помощью итераторов. Итераторы, которые, опять же, должны быть быстрее, но в PHP они также явно медленны (или это не особенность PHP?). Я говорю о функциях массива: next() prev() reset() и т. д., ну, если это вообще функции, а не одна из тех возможностей языка PHP, которые выглядят как функции.
Чтобы немного сузить этот вопрос: мне не интересно обходить массивы с шагом, превышающим 1 (также нет отрицательных шагов, т. е. обратной итерации). Меня также не интересует обход произвольных точек и обратно, просто длина от 0. Я также не вижу регулярного манипулирования массивами с более чем 1000 ключами, но я вижу массив, проходимый несколько раз в логике приложения! Что касается операций, то в основном это только манипуляции со строками и эхо.
Вот несколько справочных сайтов:
http://www.phpbench.com/
http://www.php.lt/benchmark/phpbench.php
То, что я слышу повсюду:
- работает медленно, поэтому для /
Код: Выделить всё
foreachработает быстрее.Код: Выделить всё
while - PHP foreach копирует массив, по которому выполняется итерация; чтобы сделать это быстрее, вам нужно использовать ссылочный код
- например: $key = array_keys($aHash); $size = sizeOf($key);
for ($i=0; $i < $size; $i++) быстрее, чем foreach
Код: Выделить всё
foreach 1.1438131332397
foreach (using reference) 1.2919359207153
for 1.4262869358063
foreach (hash table) 1.5696921348572
for (hash table) 2.4778981208801
- работает быстрее, чем foreach со ссылкой
Код: Выделить всё
foreach - работает быстрее, чем
Код: Выделить всё
foreach - работает быстрее, чем для хеш-таблицы.
Код: Выделить всё
foreach
- Я делаю что-то не так?
- Действительно ли PHP-ссылка foreach имеет значение? Я имею в виду, почему бы ему не скопировать его, если вы передаете по ссылке?
- Каков эквивалентный код итератора для оператора foreach; Я видел несколько штук в сети, но каждый раз, когда я их тестирую, время ускользает; Я также протестировал несколько простых конструкций итераторов, но, похоже, так и не получил даже приличных результатов. Неужели итераторы массивов в PHP просто ужасны?
- Существуют ли более быстрые способы/методы/конструкции для итерации хотя массив, отличный от FOR/FOREACH (и WHILE)?
Редактировать: Ответ
С помощью людей здесь я смог собрать воедино ответы на все вопросы. Я суммирую их здесь:
- "Я делаю что-то не так?" Кажется, консенсус таков: да, я не могу использовать echo в бенчмарках. Лично я до сих пор не понимаю, почему echo — это какая-то функция со случайным временем выполнения или как любая другая функция чем-то отличается — это и способность этого сценария просто генерировать точно такие же результаты foreach лучше, чем все остальное, сложно. чтобы объяснить, просто «вы используете эхо» (ну, что мне следовало использовать). Однако я согласен, что тест следует проводить с чем-то получше; хотя идеальный компромисс не приходит на ум.
- "Действительно ли PHP-ссылка на foreach имеет значение? Я имею в виду, почему бы ему не скопировать ее, если вы передаете по ссылке?" ircmaxell показывает, что да, дальнейшее тестирование, похоже, доказывает, что в большинстве случаев ссылка должна быть быстрее - хотя, учитывая мой приведенный выше фрагмент кода, это определенно не означает все. Я понимаю, что эта проблема, вероятно, слишком неинтуитивна, чтобы ее можно было рассматривать на таком уровне, и потребуется что-то экстремальное, например декомпиляция, чтобы действительно определить, что лучше для каждой ситуации.
- " Какой эквивалентный код итератора для оператора foreach; я видел несколько в сети, но каждый раз, когда я тестирую их, время далеко отстает; я также тестировал несколько простых конструкций итераторов, но, похоже, никогда не получал даже достойных результатов - - итераторы массивов в PHP просто ужасны?" ircmaxell предоставил ответ ниже; хотя код может быть действительным только для версии PHP >= 5
- "Есть ли более быстрые способы/методы/конструкции для перебора массива, отличного от FOR/FOREACH (и WHILE) ?" Спасибо Гордону за ответ. Использование новых типов данных в PHP5 должно дать либо прирост производительности, либо прирост памяти (любой из этих вариантов может быть желателен в зависимости от вашей ситуации). Хотя по скорости многие новые типы массивов не кажутся лучше, чем array(), splpriorityqueue и splobjectstorage кажутся существенно быстрее. Ссылка предоставлена Гордоном: http://matthewturland.com/2010/05/20/ne ... n-php-5-3/
Подробнее здесь: https://stackoverflow.com/questions/343 ... ach-in-php