$i++ vs. ++$i

Мы предлагаем оптимизацию сайтов. Реклама сайта, выгодные предложения. . Заходите трубы водоснабжения , радиаторы алюминиевые

Есть у меня товарищ, который кодит на c++. И как-то в его коде в цикле я заметил, что он пишет не i++; а ++i; - оказалось что так производительнее (ну они сишники вообще помешаны на этом всем). Почему лушче писать так, я как-то поленился разобраться, но пример я естесственно запомнил - и старался по мере сил писать такое же и в php, хуже ведь не будет все равно. Оказалось недавно, что и у нас это тоже оправдано.

Оказывается:

При использовании инструкции $count++ увеличение переменной $count выполняется после того, как будет рассчитано выражение с использованием данной переменной. Например, $i =$count++; — переменной $i будет присвоено значение переменной $count до того, как последнее будет увеличено на единицу. Это означает, что машина должна сохранить значение $count, чтобы использовать его в любом выражении с переменной $count. В инструкции же ++$count значение переменной увеличивается на единицу до вычислений, поэтому нет необходимости хранить временное значение (а это менее накладно). Если инструкция $count++ применяется в выражении, где значение переменной не используется (это называется пустым контекстом), то ее можно безопасно преобразовать в преинкрементную инструкцию.

Конечно, фигня там получается, а не оптимизация, но зато в таком коде сразу видна рука мастера :)

  • nap

    если писать на CUDA, то всегда нужно использовать ++i, а i++ работает на порядок медленнее!

  • http://demotivation.me/ Ололоша

    Это называется микро-оптимизация. И нифига в таком коде не видна рука мастера, если хотите микро-оптимизировать цикл for по самые помидоры, то надо делать так (но правда это в том случае если порядок прохода не важен):

    for (Index = count(Array) - 1; Index >= 0; --Index);

    1. пре-оператор быстрее чем пост-оператор.
    2. сравненение числа с нулем быстрее чем сравнение числа с другим числом (Index < Length)

    Вот здесь http://net-beta.net/ubench/ можно найти еще таких-же дуракаваляний.

  • Hellsinky

    Всё это делает компилятор. И циклы организует до нуля (там же может быть что-нибудь вроде «for(int i=0;i<(int)sqrt(200);i++)"!), и преобразует "i++" или "++i" друг в друга. Ваши оптимизации могут ему только мешать. Ну это ладно, пусть компилятор туп. В принципе, я примерно так и пишу. Если уж на то пошло, сравнение на равенство быстрее, чем на неравенство. Лучше будет сделать цикл от "count(Array)" до одного и сравнивать с нулём. Лирика.

    С чего это префиксные операторы быстрее постфиксных? В ассемблере нет "переменных", тем более "временных переменных". Я, например, не вижу разницу между следующим кодом.
    1. Первый вариант.
    mov eax,dword[ebx-4]
    inc dword[ebx-4]
    2. Второй вариант.
    inc dword[ebx-4]
    mov eax,dword[ebx-4]
    Не пишите ерунду, "оптимизатор".


Информеры с тИЦ и PR: получить код для сайта