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