Форум программистов, компьютерный форум CyberForum.ru

i++ vs ++i (циклы) - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 34, средняя оценка - 4.85
Saiberg
 Аватар для Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
11.06.2011, 15:05     i++ vs ++i (циклы) #1
Собстно стало интересно почему все пишут
C++
1
2
3
for(ptrdiff i = 0; i < 10; i++) {
 
}
постфиксный инкремент медленнее, а в данном случае в нем смысла я не вижу. для красоты что ли?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.06.2011, 15:05     i++ vs ++i (циклы)
Посмотрите здесь:

C++ Циклы
циклы for, while C++
C++ циклы
C++ циклы
Циклы WHILE, DO-WHILE. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Сыроежка
Заблокирован
13.09.2011, 18:36     i++ vs ++i (циклы) #41
Цитата Сообщение от Saiberg Посмотреть сообщение
Собстно стало интересно почему все пишут
C++
1
2
3
for(ptrdiff i = 0; i < 10; i++) {
 
}
постфиксный инкремент медленнее, а в данном случае в нем смысла я не вижу. для красоты что ли?
В данном контексте постфиксный инкремент не является медленнее, Так что ваш вопрос не состоятелен.
Но даже если и есть какое-нибудь преимущество в скорости, тем не мене во многих стандартных алгоритмах вы найдете использование таких конструкций, как

C++
1
*iterator++
вместо двух выражений

C++
1
*iterator; ++iterator;
То есть читабельность кода и простота его восприятия значительно перевешивают данную мышиную возню с, якобы, оптимизацией.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Блудадей
 Аватар для Блудадей
59 / 6 / 1
Регистрация: 09.09.2011
Сообщений: 12
14.09.2011, 10:28     i++ vs ++i (циклы) #42
Решил протестировать с функцией GetThreadTimes(VS C++ 2010)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <windows.h>
#include <iostream>
 
using namespace std;
 
_int64 FileTimeToQuadWord(PFILETIME ptt) 
{ 
return(Int64ShllMod32(ptt->dwHighDateTime, 32) | ptt->dwLowDateTime); 
} 
 
int main(){
volatile int v=0;
 
 
FILETIME ftUserStart, ftKernalStart, ftBuff,
         ftUserEnd  , ftKernalEnd;
 
HANDLE hThread = GetCurrentThread();
 
//------------------------------------------------------------------------------------
 
GetThreadTimes(hThread,&ftBuff,&ftBuff,&ftKernalStart,&ftUserStart);
 
for (int i=0; i<INT_MAX/2; ++i )
      v=i;
 
 
GetThreadTimes(hThread,&ftBuff,&ftBuff,&ftKernalEnd,&ftUserEnd);
 
cout<<v<<endl;//что бы оптимизатор не удалил циклы
 
 
cout<<"++i User "<<FileTimeToQuadWord(&ftUserEnd)-FileTimeToQuadWord(&ftUserStart)<<endl;
cout<<"++i Kernal "<<FileTimeToQuadWord(&ftKernalEnd)-FileTimeToQuadWord(&ftKernalStart)<<endl;
 
//----------------------------------------------------------------------------------
 
GetThreadTimes(hThread,&ftBuff,&ftBuff,&ftKernalStart,&ftUserStart);
 
for (int i=0; i<INT_MAX/2; i++ )
      v=i;
 
GetThreadTimes(hThread,&ftBuff,&ftBuff,&ftKernalEnd,&ftUserEnd);
 
cout<<v<<endl;
 
cout<<"i++ User "<<FileTimeToQuadWord(&ftUserEnd)-FileTimeToQuadWord(&ftUserStart)<<endl;
cout<<"i++ Kernal "<<FileTimeToQuadWord(&ftKernalEnd)-FileTimeToQuadWord(&ftKernalStart)<<endl;
 
cin.get();
 
return 0;
}
Результаты:
Код
Без оптимизации:
++i User 36250000
++i Kernal 0

i++ User 35625000
i++ Kernal 0

"Максимальная скорость":
++i User 12968750
++i Kernal 0

i++ User 12656250
i++ Kernal 0

"Полная оптимизация":
++i User 12812500
++i Kernal 0

i++ User 12343750
i++ Kernal 0
Добавлено через 25 минут
Сейчас протестировал на C++Builder 2009 результат обратный, так что зависит от среды
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
14.09.2011, 11:57     i++ vs ++i (циклы) #43
Цитата Сообщение от Блудадей Посмотреть сообщение
так что зависит от среды
Это бред полный. Посмотри ассемблерные коды в обоих случаях и попробуй найти отличия. Разница во времени исполнения - порядка 5%, что является скорее флуктуацией, чем различием. Я не знаю, в каких попугаях там оно измеряется, но для нормального сравнения на скорость нужны времена не меньше десятков или сотен секунд. Более того, для честного измерения нужно сравнивать два бинарника, а не два фрагмента в одном бинарнике, потому как во втором случае уже начинает играть роль такие эффекты, как положение кода в памяти, которое влияет на работу кэша. Ещё не дай боже оно на границе страницы оказалось или в разных страницах памяти. И куча подобных тонкостей

Добавлено через 27 минут
К тому же на фоне работы цикла операция инкрементации занимает мизерную долю времени, что ещё сильнее загрубляет точность измерения
TheAthlete
 Аватар для TheAthlete
151 / 151 / 12
Регистрация: 31.08.2010
Сообщений: 529
14.09.2011, 14:20     i++ vs ++i (циклы) #44
на хабре есть статья по этому поводу, для общего развития советую почитать: Есть ли практический смысл использовать для итераторов префиксный оператор инкремента ++it, вместо постфиксного it++
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
14.09.2011, 15:11     i++ vs ++i (циклы) #45
Цитата Сообщение от TheAthlete Посмотреть сообщение
Про итераторы уже всё напислаи в начале данной темы. А экономия на спичках в отладочном режиме при помощи префиксной записи - очередная ерунда. Если человеку нравится писать так, а не эдак - ради бога. Но считать при этом, что вот по таким крупицам можно наскрести 20% в скорости работы - чистый бред. Такие проценты достигаются только за счёт правильного проектирования программы, правильной реализации алгоритмов и т.п., а не за счёт экономии на спичках. Но в целом автор молодец: задумался над вопросом, разобрался в нём, рассказал людям в доходчивой форме и с нормально подведённым итогом
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
14.09.2011, 15:28     i++ vs ++i (циклы) #46
Evg, да они там все свой продукт пиарят, а не исследованиями занимаются. Вот типа мы в своем анализаторе кода добавим еще и такую штукенцию. Смотрите какой он полезный. Хотя в целом да, статьи у них получается интересные.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.09.2011, 15:41     i++ vs ++i (циклы)
Еще ссылки по теме:

с++ циклы C++
Циклы в С++ C++
C++ Циклы в с++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16824 / 5245 / 320
Регистрация: 30.03.2009
Сообщений: 14,125
Записей в блоге: 26
14.09.2011, 15:41     i++ vs ++i (циклы) #47
Цитата Сообщение от fasked Посмотреть сообщение
Evg, да они там все свой продукт пиарят
Тогда понятно, откуда такая нездоровая тяга к оптимизациям
Yandex
Объявления
14.09.2011, 15:41     i++ vs ++i (циклы)
Ответ Создать тему
Опции темы

Текущее время: 00:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru