Прежде всего, я понимаю, что в 90% приложений разница в производительности совершенно не имеет значения, но мне просто нужно знать, какая конструкция быстрее. Это и...
Информация, доступная сейчас о них в сети, сбивает с толку. Многие говорят, что foreach — это плохо, но технически он должен быть быстрее, поскольку предполагается упростить запись обхода массива с помощью итераторов. Итераторы, которые, опять же, должны быть быстрее, но в PHP они также явно медленны (или это не особенность PHP?). Я говорю о функциях массива: next() prev() reset() и т. д., ну, если это вообще функции, а не одна из тех возможностей языка PHP, которые выглядят как функции.
Чтобы немного сузить этот вопрос: мне не интересно обходить массивы с шагом, превышающим 1 (также нет отрицательных шагов, т. е. обратной итерации). Меня также не интересует обход произвольных точек и обратно, просто длина от 0. Я также не вижу регулярного манипулирования массивами с более чем 1000 ключами, но я вижу массив, проходимый несколько раз в логике приложения! Что касается операций, то в основном это только манипуляции со строками и эхо.
Вот несколько справочных сайтов:
Действительно ли 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 (не ссылочная версия) для любого простого обхода.
Прежде всего, я понимаю, что в 90% приложений разница в производительности совершенно не имеет значения, но мне просто нужно знать, какая конструкция быстрее. Это и... Информация, доступная сейчас о них в сети, сбивает с толку. Многие говорят, что foreach — это плохо, но технически он должен быть быстрее, поскольку предполагается упростить запись обхода массива с помощью итераторов. Итераторы, которые, опять же, должны быть быстрее, но в PHP они также явно медленны (или это не особенность PHP?). Я говорю о функциях массива: next() prev() reset() и т. д., ну, если это вообще функции, а не одна из тех возможностей языка PHP, которые выглядят как функции. Чтобы немного сузить этот вопрос: мне не интересно обходить массивы с шагом, превышающим 1 (также нет отрицательных шагов, т. е. обратной итерации). Меня также не интересует обход произвольных точек и обратно, просто длина от 0. Я также не вижу регулярного манипулирования массивами с более чем 1000 ключами, но я вижу массив, проходимый несколько раз в логике приложения! Что касается операций, то в основном это только манипуляции со строками и эхо. Вот несколько справочных сайтов:
http://www.phpbench.com/ http://www.php.lt/benchmark/phpbench.php То, что я слышу повсюду: [list][*][code]foreach[/code] работает медленно, поэтому для /[code]while[/code] работает быстрее. [*]PHP foreach копирует массив, по которому выполняется итерация; чтобы сделать это быстрее, вам нужно использовать ссылочный код [*]например: $key = array_keys($aHash); $size = sizeOf($key); for ($i=0; $i < $size; $i++) быстрее, чем foreach [/list] Вот моя проблема. Я написал этот тестовый скрипт: http://pastebin.com/1ZgK07US и сколько бы раз я его ни запускал, получаю что-то вроде этого: [code]foreach 1.1438131332397 foreach (using reference) 1.2919359207153 for 1.4262869358063 foreach (hash table) 1.5696921348572 for (hash table) 2.4778981208801 [/code] Коротко: [list] [*][code]foreach[/code] работает быстрее, чем foreach со ссылкой [*][code]foreach[/code] работает быстрее, чем [*][code]foreach[/code] работает быстрее, чем для хеш-таблицы. [/list] Может кто-нибудь объяснить? [list] [*]Я делаю что-то не так? [*]Действительно ли PHP-ссылка foreach имеет значение? Я имею в виду, почему бы ему не скопировать его, если вы передаете по ссылке? [*]Каков эквивалентный код итератора для оператора foreach; Я видел несколько штук в сети, но каждый раз, когда я их тестирую, время ускользает; Я также протестировал несколько простых конструкций итераторов, но, похоже, так и не получил даже приличных результатов. Неужели итераторы массивов в PHP просто ужасны? [*]Существуют ли более быстрые способы/методы/конструкции для итерации хотя массив, отличный от FOR/FOREACH (и WHILE)? [/list] PHP версии 5.3.0 [b]Редактировать: Ответ[/b] С помощью людей здесь я смог собрать воедино ответы на все вопросы. Я суммирую их здесь: [list] [*]"Я делаю что-то не так?" Кажется, консенсус таков: да, я не могу использовать echo в бенчмарках. Лично я до сих пор не понимаю, почему 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/ [/list] Я, скорее всего, буду придерживаться foreach (не ссылочная версия) для любого простого обхода.