За последние 24 часа нас посетили 55733 программиста и 1793 робота. Сейчас ищут 829 программистов ...

Загадка на ПХП

Тема в разделе "Прочие вопросы по PHP", создана пользователем ONK, 17 сен 2007.

  1. host

    host Активный пользователь

    С нами с:
    20 июн 2007
    Сообщения:
    733
    Симпатии:
    3
    не знаю у меня показало что for медленее foreach :?
     
  2. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    lexa
    host

    "хорошим" sql можно свести на ноль все эти изыски.
    я юзаю и то и другое и не думаю что быстрее и на ского ms.
     
  3. Anonymous

    Anonymous Guest

    Ага, что выше — горячее или мягкое, а?

    Их нельзя прямо сравнивать, у них у всех функционал различен.
     
  4. lexa

    lexa Активный пользователь

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Горбунов Олег, но не напримере первого поста.
     
  5. host

    host Активный пользователь

    С нами с:
    20 июн 2007
    Сообщения:
    733
    Симпатии:
    3
    во во
     
  6. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    По моим изысканиям foreach быстрее чем for ~ в 2 раза. И, кстати, это легко объяснить.

    Всё сводиться с природе PHP, а именно тому, что это скриптовый язык. Разница состоит в том, что foreach содержит все манипуляции с массивом внутри себя, на уровне ядра, написанного на C. for же полностью обрабатывает массив PHP операндами.
    Возьмём пример
    PHP:
    1. <?php
    2. $array = range(0, 1000);
    3.  
    4. for ($i = 0, $cnt = sizeof($array); $i < $cnt; $i++){
    5.     $item = $array[$i];
    6. }
    7.  
    8. foreach ($array as $value){
    9.     $item = $value;
    10. }
    11.  
    Так в чём же разница между этими двумя конструкциями помимо визуальной записи? Давайте разберёмся что происходит на уровне PHP кода.

    for
    1). Инициализируеться счётчик цикла $i
    2). Узнаем размерность массива и записываем результат в $cnt
    3). Проверяем условие конца цикла - меньще ли $i чем $cnt
    4). Присваеваем $item значение текущего элемента массива.
    5). Инкрементируем $i и переходим к пункту 3.

    foreach
    1). Инициализируем перебор массива
    2). $value присваиваем в $item и повторяем действие 2 пока не закончиться массив.

    Так это выглядет с точки зрения PHP (без вникания во внутренности конструкций for и foreach).
    У foreach меньше действий, и он быстрее даже не смотря на то, что массив может быть ассоциативный, что само по себе намного медленее обычного числового массива. У for у нас в PHP 5 действий, из них 3 выполняються циклически, У foreach всего 2, при этом циклически выполняеться только одно. Как вы все знаете, скорость выполнения C кода намного больше чем PHP, пусть даже это PHP extension. В итоге мы имеем в случае for перебор полностью на уровне PHP, при foreach весь перебор происходит на уровне C. Отсюда и такая, с первого взгляда кажущаяся странной, разница в скорости выполнения этих циклов.

    Ещё влияет то обстоятельство, что в случае for мы имеем доступ к массиву. Как бы этого не хотелось, а это куда более долгая процедура чем доступ к переменной, который мы имеем во втором случае. Ну и в случае for у нас расходуеться немного больше памяти, т.к. нам нужно 2 дополнительных переменных.

    З.Ы. Народ, мне кажеться, или у меня действительно таллант к программированию и глубокому пониманию работы вещей, связанных с программированием....?!
     
  7. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Так быстрее или медленнее?
     
  8. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Очепятался, поправился
     
  9. Anonymous

    Anonymous Guest

    «Ты гений. Парадоксы — лишь прикрытье.» © Ольга Арсентьева.