Во-первых, я понимаю, что в 90% приложений разница в производительности совершенно несущественна, но мне просто нужно знать, какая конструкция быстрее. Это и ...
Информация, доступная в настоящее время о них в сети, сбивает с толку. Многие люди говорят, что foreach - это плохо, но технически это должно быть быстрее, поскольку предполагается упростить написание массива с помощью итераторов. Итераторы, которые опять-таки должны быть более быстрыми, но в PHP, по-видимому, тоже очень медленные (или это не PHP)? Я говорю о функциях массива: next () prev () reset () и т. Д. Хорошо, если они являются даже функциями, а не одной из тех функций языка PHP, которые выглядят как функции.
Чтобы немного сузить это : Меня не интересует обход массивов с шагами, превышающими 1 (отрицательных шагов тоже нет, т. Е. Обратная итерация). Я также не заинтересован в обходе и от произвольных точек, просто 0 к длине. Я также не вижу, чтобы манипулирование массивами с более чем 1000 клавиш происходит регулярно, но я вижу, что массив перебирается несколько раз в логике приложения! Также что касается операций, в основном только строковых манипуляций и эхо.
Вот несколько справочных сайтов:
http://www.phpbench.com/
http://www.php.lt/benchmark /phpbench.php
What я слышу везде:
foreach
работает медленно, и, таким образом, для
/ , в то время как
быстрее foreach
копирует массив, по которому он повторяется; чтобы сделать это быстрее, вам нужно использовать код ссылки $ key = array_keys ($ aHash); $ size = sizeOf ($ key);
для ($ i = 0; $ 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
быстрее, чем для
, foreach
быстрее, чем для
для хеш-таблицы Кто-нибудь может объяснить?
PHP версии 5.3.0
foreach
быстрее, чем foreach
со ссылкой foreach
быстрее, чем для
foreach
быстрее, чем для
для хеш-таблицы Кто-нибудь может объяснить?
PHP версии 5.3.0
foreach
быстрее, чем foreach
со ссылкой foreach
быстрее, чем для
foreach
быстрее, чем для
для хеш-таблицы Кто-нибудь может объяснить?
PHP версии 5.3.0
С помощью людей здесь я смог собрать воедино ответы на все вопросы. Я суммирую их здесь:
Я играю с Ruby .object_id
и заметил, что в нескольких последовательных сеансах irb я получаю эти идентичные результаты:
false.object_id // 0
true.object_id // 2
nil.object_id // 4
100.object_id // 201
На самом деле каждый целое число object_id кажется быть ((значение * 2) + 1).
С другой стороны, object_id данной строки никогда не будет прежним после выхода и повторного запуска irb.
Это вызывает у меня несколько вопросов:
object_id
? Являются ли другие в основном случайными? Используя предложение Эндрю Гримма, я попытался обнаружить другие объекты с «низким идентификатором», но обнаружил, что:
В MRI object_id
объекта совпадает с VALUE
, который представляет объект на уровне C. Для большинства видов объектов этот VALUE
является указателем на место в памяти, где хранятся фактические данные объекта. Очевидно, что при многократных запусках это место будет разным, поскольку оно зависит только от того, где система решила выделить память, а не от какого-либо свойства самого объекта.
Однако по причинам производительности true
, false
, nil
и Fixnum
обрабатываются специально. Для этих объектов в памяти не существует структуры с данными объекта. Все данные объекта закодированы в самом VALUE
. Как вы уже поняли, значения для false
, true
, nil
и любого Fixnum
i
, являются 0
, 2
, 4
и i*2+1
соответственно.
Причина, по которой это работает, заключается в том, что на любых системах, на которых работает MRI, 0
, 2
, 4
и i*2+1
никогда не являются действительными адресами для объекта на куче, поэтому нет никакого пересечения с указателями на данные объекта.
Назначение целого числа (значение * 2) + 1
и нецелых чисел (x * 2)
аналогично парадоксу Гильберта Гранд-отель , в котором описывается, как разместить бесконечно больше гостей в бесконечном отеле.
Что касается поиска объектов по их идентификатору, существует ObjectSpace._id2ref (object_id)
. Если в вашей реализации нет ObjectSpace.