[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Преинкремент или постинкремент
alex12060
Я однажды наткнулся на статейку об оптимизации скриптов и ускорении оных в работе. Там нашел много мелочей, но, наткнулся на очень интересную вещь:

В циклах for() используйте вместо постинкремента ($i++) преинкремент (++$i)

Очень интересно стало, почему-же? Ведь люди пишут, которые знают о чем говорят.

Почитав в интернете, а точнее, несколько топиков из разных форумов, я узнал причину столь дерзкого отношения к постинкременту, попробую объяснить)

Общие понятия

Постинкремент по сути, как и преинкремент это увеличение (уменьшение) переменной на 1 единицу.
Т.е такая вот запись:

for($i=0; $i<=10; $i++) echo $i.'<br />';


выведет в вертикальную строку 10 записей. С каждой итерацией переменная $i будет увеличиваться на 1 единицу.

Объяснение отличия

Постинкремент, при увеличении на 1 единицу (также не забываем и про --) делает такие шаги:
  • Создает в памяти ячейку, в которую заносит старое значение переменной
  • Внутри ячейки увеличивает (или уменьшает) на единицу данное значение
  • Заменяет исходное значение новым
  • Удаляет ячейку
В то время, как преинкремент сразу увеличивает (уменьшает) значение в самой переменной, без подобных шагов.

Разница в 4 шага!

Попробуем на практике

Первый скрипт:

for($i=0; $i<5000000; $i++);


Второй скрипт:

for($i=0; $i<5000000; ++$i);


Время выполнения 1 скрипта: 0.983823
Время выполнения 1 скрипта: 0.881252

Надеюсь, я был полезен) Спасибо за внимание!
inpost
Николай это рассказывал уже, что ++$i лучше, но причину так и не знал. Спасибо, познавательно.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
sergeiss
alex12060 - спасибо за инфо... Тольку у тебя накладочка вышла smile.gif Для меня, например, разница в выполнении одной такой итерации в 1.0Е-7 насколько не принципиальна, что я буду использовать $i++ или ++$i в зависимости от нужного мне алгоритма.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
alex12060
Я спецально взял большое значение инкремента)

Я тоже думаю, что это не принципиальная разница во времени, чтобы, посчитать например числа от 1 до 10)

А вот в больших расчетах и обльших кол-вах циклов, при том еще, возможно вложенных и т.д разница будет...заметной)
sergeiss
А что считать заметной разницей? 10 секунд? Согласно твоим же расчетам, это будет цикл в 500 млн. итераций. Такие расчеты в любом случае лучше не на ПХП делать. А на Си, например smile.gif

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
twin
Я вот использую префиксную форму (если по алгоритму не важно). И дело тут не только в скорости, она тут дело совершенно вторичное. Тут дело в читабельности. Все же фраза "увеличиваем значение переменной" звучит лаконичнее, чем "значение переменной увеличиваем".
Но это так, к слову. Тут дело привычки.

_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
glock18
alex12060
inpost
sergeiss
++$i быстрее $i++ потому что интерпретатору не нужно запоминать значение переменной перед увеличением, что на этапе байт-кода экономит одну операцию. если сейчас все еще безразлично какую форму использовать, если это непринципиально в задаче, то берите преинкремент. а вообще выигрыш на деле получится такой, что даже холивар echo/print рядом не стоял в своей бесполезности.
Xrum
Объясните, пожалуйста, новичку, зачем нужны два оператора, выполняющих практически одну и ту же задачу без видимых различий? тем более, что пре- даже теоретически быстрее чем пост-

я не пытаюсь умничать, мне действительно интересно. rolleyes.gif
inpost
$x = 1;
if($x++ == 2) {

}


Отдельно:
$x = 1;
if(++$x == 2) {

}


_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
Xrum
Цитата (inpost @ 17.05.2013 - 00:39)
$x = 1;
if($x++ == 2) {

}

Отдельно:
$x = 1;
if(++$x == 2) {

}



если я правильно понял, x++ сначала обрабатывает переменную, потом прибавляет, а в ++x сначала прибавляет, потом обрабатывает?
twin
Xrum
Цитата
если я правильно понял, x++ сначала обрабатывает переменную, потом прибавляет, а в ++x сначала прибавляет, потом обрабатывает?
Какая то странная фраза...
Не обрабатывает нужно говорить, а возвращает.
Нагляднее смотрится так:

<?php

    $a = 1;
    echo $a++;
   
    echo '<br>';
   
    $a = 1;
    echo ++$a;


_____________
Если вам недостаточно собственных заблуждений, можно расширить их мнениями экспертов.

Нужно уважать мнение оппонета. Ведь заблуждаться - его святое право.

Настаивал, настаиваю и буду настаивать на своем. На кедровых орешках.

user posted image
TcKJey
Цитата (alex12060 @ 9.03.2011 - 18:52)
Общие понятия

Постинкремент по сути, как и преинкремент это увеличение (уменьшение) переменной на 1 единицу.
Т.е такая вот запись:

for($i=0; $i<=10; $i++) echo $i.'<br />';


выведет в вертикальную строку 10 записей. С каждой итерацией переменная $i будет увеличиваться на 1 единицу.

Поправлю, выведет 11 записей.
sergeiss
TcKJey, ты вообще видел, когда тема была создана??? Ей уже 5 (пять!) лет.


_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
TcKJey
Цитата (sergeiss @ 19.03.2016 - 23:36)
TcKJey, ты вообще видел, когда тема была создана??? Ей уже 5 (пять!) лет.

Видел, но по запросу "что быстрее постинкремент или преинкремент" эта тема на 1ой странице в поисковике, так что решил указать на эту неточность)
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.