Правила     Закладки     Карма    Календарь    Журналы    Помощь    Поиск    PDA    Чат   
        СМС-ки
   
Пейджер выключен!
 
Фильтр авторов:    показать 
  скрыть
  Ответ в темуСоздание новой темыСоздание опроса

> Преинкремент или постинкремент, Что выбрать?
alex12060  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Мирный
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3229
Пользователь №: 24994
На форуме: 6 лет, 18 дней
Карма: 142

Трезвый :
4 года, 11 месяцев, 8 дней


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

В циклах 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

Надеюсь, я был полезен) Спасибо за внимание!
PMПисьмо на e-mail пользователюСайт пользователяICQ
    1   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
inpost  
Дата
Цитировать сообщение

Пользователь сейчас на форуме



Помагите Здесь живу!!!
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 22694
Пользователь №: 20039
На форуме: 7 лет, 2 дня
Карма: 599




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


--------------------
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 14978
Пользователь №: 4190
На форуме: 8 лет, 10 месяцев, 3 дня
Карма: 444




alex12060 - спасибо за инфо... Тольку у тебя накладочка вышла smile.gif Для меня, например, разница в выполнении одной такой итерации в 1.0Е-7 насколько не принципиальна, что я буду использовать $i++ или ++$i в зависимости от нужного мне алгоритма.


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

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

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

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
alex12060  
 ۩  Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Мирный
******

Профиль
Группа: Форумчанин
Завсегдатай форума
Сообщений: 3229
Пользователь №: 24994
На форуме: 6 лет, 18 дней
Карма: 142

Трезвый :
4 года, 11 месяцев, 8 дней


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

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

А вот в больших расчетах и обльших кол-вах циклов, при том еще, возможно вложенных и т.д разница будет...заметной)
PMПисьмо на e-mail пользователюСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 14978
Пользователь №: 4190
На форуме: 8 лет, 10 месяцев, 3 дня
Карма: 444




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


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

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

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

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15562
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 6 дней
Карма: 299

Трезвый :
5 лет, 11 месяцев, 15 дней


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


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

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

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
glock18  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Be prepared
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 5199
Пользователь №: 17723
На форуме: 7 лет, 6 месяцев, 27 дней
Карма: 57




alex12060
inpost
sergeiss
++$i быстрее $i++ потому что интерпретатору не нужно запоминать значение переменной перед увеличением, что на этапе байт-кода экономит одну операцию. если сейчас все еще безразлично какую форму использовать, если это непринципиально в задаче, то берите преинкремент. а вообще выигрыш на деле получится такой, что даже холивар echo/print рядом не стоял в своей бесполезности.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Xrum  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 12
Пользователь №: 37423
На форуме: 3 года, 6 месяцев, 27 дней
Карма:




Объясните, пожалуйста, новичку, зачем нужны два оператора, выполняющих практически одну и ту же задачу без видимых различий? тем более, что пре- даже теоретически быстрее чем пост-

я не пытаюсь умничать, мне действительно интересно. rolleyes.gif
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
inpost  
Дата
Цитировать сообщение

Пользователь сейчас на форуме



Помагите Здесь живу!!!
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 22694
Пользователь №: 20039
На форуме: 7 лет, 2 дня
Карма: 599




$x = 1;
if($x++ == 2) {

}


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

}


--------------------
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
PMПисьмо на e-mail пользователюICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
Xrum  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 12
Пользователь №: 37423
На форуме: 3 года, 6 месяцев, 27 дней
Карма:




Цитата (inpost @ 17.05.2013 - 00:39)
$x = 1;
if($x++ == 2) {

}

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

}



если я правильно понял, x++ сначала обрабатывает переменную, потом прибавляет, а в ++x сначала прибавляет, потом обрабатывает?
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
twin  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Глухой нуб
******

Профиль
Группа: Администратор
Почтальон группы
Сообщений: 15562
Пользователь №: 6543
На форуме: 8 лет, 2 месяца, 6 дней
Карма: 299

Трезвый :
5 лет, 11 месяцев, 15 дней


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

<?php

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


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

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

Зачем ворошить старое, когда можно наворотить новое?

user posted image
PMСайт пользователяICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
TcKJey  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 2
Пользователь №: 42709
На форуме: 8 месяцев, 19 дней
Карма:




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

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

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


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

Поправлю, выведет 11 записей.
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
sergeiss  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Сидел он, дум великих полон - и вдаль глядел
******

Профиль
Группа: Эксперт
Группа переписки
Сообщений: 14978
Пользователь №: 4190
На форуме: 8 лет, 10 месяцев, 3 дня
Карма: 444




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


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

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

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

user posted image
PMICQ
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
TcKJey  
Дата
Цитировать сообщение

Пользователя сейчас нет на форуме



Новичок
*

Профиль
Группа: Пользователь
Сообщений: 2
Пользователь №: 42709
На форуме: 8 месяцев, 19 дней
Карма:




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

Видел, но по запросу "что быстрее постинкремент или преинкремент" эта тема на 1ой странице в поисковике, так что решил указать на эту неточность)
PMПисьмо на e-mail пользователю
    0   Для быстрого поиска похожих сообщений выделите 1-2 слова в тексте и нажмите сюда Для быстрой цитаты из этого сообщения выделите текст и нажмите сюда
  Быстрый ответ
Информация о Госте
Введите Ваше имя
Кнопки кодов
Для вставки цитаты, выделите нужный текст и
НАЖМИТЕ СЮДА
Введите сообщение
Смайлики
:huh:  :o  ;) 
:P  :D  :lol: 
B)  :rolleyes:  <_< 
:)  :angry:  :( 
:unsure:  :blink:  :ph34r: 
     
Показать всё

Опции сообщения  Включить смайлики?
 Включить подпись?
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:

Опции темы Ответ в темуСоздание новой темыСоздание опроса