Производительность FOR и FOREACH в PHPPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Производительность FOR и FOREACH в PHP

Сообщение Anonymous »

Прежде всего, я понимаю, что в 90% приложений разница в производительности совершенно не имеет значения, но мне просто нужно знать, какая конструкция быстрее. Это и...
Информация, доступная сейчас о них в сети, сбивает с толку. Многие говорят, что foreach — это плохо, но технически он должен быть быстрее, поскольку предполагается упростить запись обхода массива с помощью итераторов. Итераторы, которые, опять же, должны быть быстрее, но в PHP они также явно медленны (или это не особенность PHP?). Я говорю о функциях массива: next() prev() reset() и т. д., ну, если это вообще функции, а не одна из тех возможностей языка PHP, которые выглядят как функции.
Чтобы немного сузить этот вопрос: мне не интересно обходить массивы с шагом, превышающим 1 (также нет отрицательных шагов, т. е. обратной итерации). Меня также не интересует обход произвольных точек и обратно, просто длина от 0. Я также не вижу регулярного манипулирования массивами с более чем 1000 ключами, но я вижу массив, проходимый несколько раз в логике приложения! Что касается операций, то в основном это только манипуляции со строками и эхо.
Вот несколько справочных сайтов:

http://www.phpbench.com/
http://www.php.lt/benchmark/phpbench.php
То, что я слышу повсюду:
  • работает медленно, поэтому для / работает быстрее.
  • 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
Коротко: Может кто-нибудь объяснить?
  • Я делаю что-то не так?
  • Действительно ли PHP-ссылка foreach имеет значение? Я имею в виду, почему бы ему не скопировать его, если вы передаете по ссылке?
  • Каков эквивалентный код итератора для оператора foreach; Я видел несколько штук в сети, но каждый раз, когда я их тестирую, время ускользает; Я также протестировал несколько простых конструкций итераторов, но, похоже, так и не получил даже приличных результатов. Неужели итераторы массивов в PHP просто ужасны?
  • Существуют ли более быстрые способы/методы/конструкции для итерации хотя массив, отличный от FOR/FOREACH (и WHILE)?
PHP версии 5.3.0
Редактировать: Ответ
С помощью людей здесь я смог собрать воедино ответы на все вопросы. Я суммирую их здесь:
  • "Я делаю что-то не так?" Кажется, консенсус таков: да, я не могу использовать 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/
Я, скорее всего, буду придерживаться foreach (не ссылочная версия) для любого простого обхода.

Подробнее здесь: https://stackoverflow.com/questions/343 ... ach-in-php
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»