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

Во-первых, я понимаю, что в 90% приложений разница в производительности совершенно несущественна, но мне просто нужно знать, какая конструкция быстрее. Это и ...

Информация, доступная в настоящее время о них в сети, сбивает с толку. Многие люди говорят, что foreach - это плохо, но технически это должно быть быстрее, поскольку предполагается упростить написание массива с помощью итераторов. итераторы, которые, опять же, должны быть более быстрыми, но в PHP, по-видимому, слишком медленными (или это не PHP)? Я говорю о функциях массива: next () prev () reset () и т. Д. Хорошо, если они являются даже функциями, а не одной из тех функций языка PHP, которые выглядят как функции.

Чтобы немного сузить это : Меня не интересует обход массивов с шагами, превышающими 1 (никаких отрицательных шагов тоже нет, т.е. обратная итерация). Я также не заинтересован в обходе и от произвольных точек, просто 0 к длине. Я также не вижу, что манипулирование массивами с более чем 1000 ключами происходит регулярно, но я вижу, что массив перебирается несколько раз в логике приложения! Также что касается операций, в основном только строковых манипуляций и эхо.

Вот несколько справочных сайтов:
http: // www. phpbench.com/
http://www.php.lt/benchmark/phpbench.php

What, что я слышу везде: foreach медленный, и, таким образом, для / в то время как быстрее

  • PHPs 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 быстрее, чем для для хеш-таблицы

    Кто-нибудь может объяснить?

    1. Я что-то не так делаю?
    2. Действительно ли референсная ссылка на PHP имеет значение? Я имею в виду, почему бы не скопировать его, если вы передадите по ссылке?
    3. Какой эквивалентный код итератора для оператора foreach; Я видел несколько в сети, но каждый раз, когда я проверяю их, время отстает; Я также протестировал несколько простых конструкций итераторов, но, похоже, никогда не получал даже приличных результатов - действительно ли итераторы массивов в PHP просто ужасны?
    4. Существуют ли более быстрые способы / методы / конструкции для итерации через массив, отличный от FOR / FOREACH? (и WHILE)?

    PHP версии 5.3.0 видел несколько в сети, но каждый раз, когда я проверяю их, время отстает; Я также протестировал несколько простых конструкций итераторов, но, похоже, никогда не получал даже приличных результатов - действительно ли итераторы массивов в PHP просто ужасны?

  • Существуют ли более быстрые способы / методы / конструкции для итерации через массив, отличный от FOR / FOREACH? (и WHILE)?
  • PHP версии 5.3.0 видел несколько в сети, но каждый раз, когда я проверяю их, время отстает; Я также протестировал несколько простых конструкций итераторов, но, похоже, никогда не получал даже приличных результатов - действительно ли итераторы массивов в PHP просто ужасны?

  • Существуют ли более быстрые способы / методы / конструкции для итерации через массив, отличный от FOR / FOREACH? (и WHILE)?
  • PHP версии 5.3.0


    Редактировать: Ответить

    С помощью людей здесь я смог собрать воедино ответы на все вопросы. Я суммирую их здесь:

    1. «Я что-то не так делаю?» Похоже, консенсус таков: да, я не могу использовать эхо в тестах. Лично я до сих пор не понимаю, как эхо - это какая-то функция со случайным временем выполнения или как любая другая функция как-то отличается - это и способность этого скрипта просто генерировать точно такие же результаты foreach лучше, чем все, трудно чтобы объяснить, хотя просто «вы используете эхо» (хорошо, что я должен был использовать). Тем не менее, я признаю, что тест должен быть сделан с чем-то лучшим; хотя идеальный компромисс не приходит на ум.
    2. «Действительно ли PHP foreach эталонная вещь действительно имеет значение? Я имею в виду, почему бы не копировать ее, если вы передадите по ссылке?» ircmaxell показывает, что да, это так, дальнейшее тестирование, кажется, доказывает, что в большинстве случаев ссылки должны быть быстрее - хотя, учитывая мой фрагмент кода выше, определенно не все. Я допускаю, что проблема, вероятно, слишком неинтуитивна, чтобы с ней беспокоиться на таком уровне, и для ее решения потребовалось бы что-то экстремальное, например, декомпиляция, чтобы на самом деле определить, что лучше для каждой ситуации.
    3. Я видел несколько в сети, но каждый раз, когда я тестирую их, время отстает; я также тестировал несколько простых конструкций итераторов, но, кажется, никогда не получаю даже приличных результатов - итераторы массивов в PHP просто ужасны? " ircmaxell предоставил ответ ниже; хотя код может быть действительным только для версии PHP> = 5
    4. " Можно ли использовать TypeConverter вместо событий Format / Parse? В форме Winforms я хочу предоставить пользователю визуальные подсказки, когда поле ввода содержит недопустимое значение. Для этого я хочу привязать свойство ForeColor метки поля ввода к (логическому) ...

      В форме Winforms я хочу предоставить пользователю визуальные подсказки, когда поле ввода содержит недопустимое значение. Для этого я хочу связать свойство ForeColor метки поля ввода со свойством (логическим) IsPropertyValid базовой модели, чтобы метка становилась красной, когда IsPropertyValid == false .

      В настоящее время у меня есть обработчик события для события формата привязки :

      Controls["dateOfBirthLabel"].DataBindings["ForeColor"].Format += convertBoolToColor;
      // (dateOfBirthLabel.ForeColor is bound to a boolean IsDateOfBirthValid property.)
      
      void convertBoolToColor(object sender, ConvertEventArgs e)
      {
          e.Value = (bool)e.Value ? Color.Black : Color.Red;
      }
      

      Если бы я хотел сделать это в WPF, Я полагаю, что я бы указывал пользовательский преобразователь значений ( bool - Color ) напрямую с привязкой в ​​XAML. Самое главное, мне не пришлось бы ссылаться на конкретный элемент управления через его имя.

      Я хотел бы сделать то же самое с моей формой Winforms. В идеале я мог бы указать объект TypeConverter для конкретной привязки непосредственно в конструкторе форм. Возможно ли это?

    7
    задан stakx supports GoFundMonica 26 January 2015 в 10:42
    поделиться