Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/37: Рейтинг темы: голосов - 37, средняя оценка - 5.00
 Аватар для Saiberg
20 / 20 / 2
Регистрация: 23.09.2010
Сообщений: 193

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

11.06.2011, 15:05. Показов 8669. Ответов 46
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собстно стало интересно почему все пишут
C++
1
2
3
for(ptrdiff i = 0; i < 10; i++) {
 
}
постфиксный инкремент медленнее, а в данном случае в нем смысла я не вижу. для красоты что ли?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.06.2011, 15:05
Ответы с готовыми решениями:

Заменить в коде циклы for на циклы while
int i, j, n; bool a; cin &gt;&gt; i &gt;&gt; n; for (i; i&lt;n; i++) { a = true; for (j = 2; j &lt;= i / 2; j++) if ((i%j) == 0) a =...

Циклы с условием, циклы с переменной, вложенные циклы
С условием 1. Ввести натуральное число N и вычислить сумму всех чисел фибоначчи меньших N. Предусмотреть защиту от ввода...

Циклы. Напечатать числа в виде таблицы, используя только циклы
Напечатать числа в виде таблицы, используя только циклы (массивы и строки не применять): 1 2 2 ...

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

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

C++
1
*iterator; ++iterator;
То есть читабельность кода и простота его восприятия значительно перевешивают данную мышиную возню с, якобы, оптимизацией.
0
 Аватар для Блудадей
59 / 6 / 1
Регистрация: 09.09.2011
Сообщений: 12
14.09.2011, 10:28
Решил протестировать с функцией 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;
}
Результаты:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Без оптимизации:
++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 результат обратный, так что зависит от среды
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
14.09.2011, 11:57
Цитата Сообщение от Блудадей Посмотреть сообщение
так что зависит от среды
Это бред полный. Посмотри ассемблерные коды в обоих случаях и попробуй найти отличия. Разница во времени исполнения - порядка 5%, что является скорее флуктуацией, чем различием. Я не знаю, в каких попугаях там оно измеряется, но для нормального сравнения на скорость нужны времена не меньше десятков или сотен секунд. Более того, для честного измерения нужно сравнивать два бинарника, а не два фрагмента в одном бинарнике, потому как во втором случае уже начинает играть роль такие эффекты, как положение кода в памяти, которое влияет на работу кэша. Ещё не дай боже оно на границе страницы оказалось или в разных страницах памяти. И куча подобных тонкостей

Добавлено через 27 минут
К тому же на фоне работы цикла операция инкрементации занимает мизерную долю времени, что ещё сильнее загрубляет точность измерения
1
 Аватар для TheAthlete
174 / 170 / 19
Регистрация: 31.08.2010
Сообщений: 575
14.09.2011, 14:20
на хабре есть статья по этому поводу, для общего развития советую почитать: Есть ли практический смысл использовать для итераторов префиксный оператор инкремента ++it, вместо постфиксного it++
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
14.09.2011, 15:11
Цитата Сообщение от TheAthlete Посмотреть сообщение
Про итераторы уже всё напислаи в начале данной темы. А экономия на спичках в отладочном режиме при помощи префиксной записи - очередная ерунда. Если человеку нравится писать так, а не эдак - ради бога. Но считать при этом, что вот по таким крупицам можно наскрести 20% в скорости работы - чистый бред. Такие проценты достигаются только за счёт правильного проектирования программы, правильной реализации алгоритмов и т.п., а не за счёт экономии на спичках. Но в целом автор молодец: задумался над вопросом, разобрался в нём, рассказал людям в доходчивой форме и с нормально подведённым итогом
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
14.09.2011, 15:28
Evg, да они там все свой продукт пиарят, а не исследованиями занимаются. Вот типа мы в своем анализаторе кода добавим еще и такую штукенцию. Смотрите какой он полезный. Хотя в целом да, статьи у них получается интересные.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21287 / 8312 / 637
Регистрация: 30.03.2009
Сообщений: 22,671
Записей в блоге: 30
14.09.2011, 15:41
Цитата Сообщение от fasked Посмотреть сообщение
Evg, да они там все свой продукт пиарят
Тогда понятно, откуда такая нездоровая тяга к оптимизациям
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.09.2011, 15:41

Циклы. Напечатать числа в виде таблицы, используя только циклы
4. Напечатать числа в виде таблицы, используя только циклы (массивы и строки не применять): 1 2 2 ...

Переведите исходные циклы в циклы других форматотв:
Переведите исходные циклы в циклы других форматотв: For i:73 to 122 do в Цикл while: в Цикл repeat: For i:256 downto 100 do в...

Циклы в Паскале (циклы с пост- и предусловием)
Требуется напиcать программу, которая запрашивает числа с клавиатуры до тех пор, пока сумма чисел не превысит 25 или введенное число не...

Циклы с параметром (циклы ДЛЯ)
Заданные векторы X(N) и Y(N) преобразовать по правилу: большее из xi и yi принять в качестве нового значения xi , а меньшее - в качестве...

циклы
Составить программу,которая находит наибольшее значение отношения трехзначного числа к сумме его цифр. Добавлено через 24 минуты ...


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

Или воспользуйтесь поиском по форуму:
47
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru