|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
08.04.2024, 10:22 | #1 |
Пользователь
Регистрация: 06.01.2021
Сообщений: 52
|
Уничтожаю миф о том, что ++i эффективнее i++ в цикле for в C++.
Слышал, якобы префиксный инкремент эффективнее, т.к. не создаётся копия объекта.
Я провёл мини-исследование и обнаружил, что для простого цикла for это не так. Для начала, напишем такую программу в файле increment.cpp: Код:
Давайте скомпилируем её при помощи g++. Флаг -S попросит компилятор остановиться перед ассемблированием нашей программы, т.е. мы получим код на языке ассемблера перед преобразованием в чисто машинный код. Код:
Тут фрагмент этого файла. Весь файл нам не нужен. Давайте проанализируем его. Код:
Далее воспользуемся clang и снова получим increment.s: Код:
Обнаружим довольно странные вещи (лишь фрагмент) в наших циклах: Код:
Код:
Вывод: Для итераторов может разница вполне может быть, надо проверить отдельно. Я уверен, что люди это уже исследовали. Но конкретно для простого цикла for с переменной типа int в качестве счётчика разницы НЕТ. Проверил для двух переменных-счётчиков цикла (for (int i = 255, j = 50; ...), я про это) - никакой разницы, ровно одна инструкция. Поэтому можно использовать то, что удобнее и не усложнять. Приведённый пример работал без флагов -O1, -O2, и -O3. Например, при использовании флага -O2 и -O3 с g++ код превращается в нечто ещё более непонятное, но можно найти заранее вычисленные 160 и 165. С флагом -O1 вся функция выглядит так, будто компилятор сначала понял, что программа хочет сделать, и потом сгенерировал код, котороый просто выводит нужные числа. Код:
Последний раз редактировалось iXNomad; 08.04.2024 в 10:27. |
08.04.2024, 11:11 | #2 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,760
|
Вы идиот? Компиляторы давно делают эту оптимизацию для простых случаев + кучу других. Хотите сравнить возмите итераторы в дебаге или другие классы с копирование/доп. действиями и т.д.
|
08.04.2024, 21:17 | #3 |
Участник клуба
Регистрация: 03.06.2009
Сообщений: 1,834
|
а где графики, исследования на конкретных расчётных задачах с выводом времени, чтоб этот многострадальный i++ реально протестировать?
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
|
09.04.2024, 06:26 | #4 | |
фрилансер
Участник клуба
Регистрация: 11.10.2019
Сообщений: 1,010
|
iXNomad, поздравляю с открытием существования оптимизатора
чтобы ещё больше удивиться возможностям оптимизаторов: Поговорим об оптимизирующих компиляторах RVO и NRVO в C++17 Цитата:
Последний раз редактировалось Алексей1153; 09.04.2024 в 07:00. |
|
10.04.2024, 04:32 | #5 |
Форумчанин
Регистрация: 13.03.2023
Сообщений: 113
|
А мне понравилось. Очень напоминает чеховское "Письмо к ученому соседу".
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как эффективнее обрабатывать большой файл по кускам? | ccccfr | Win Api | 5 | 24.07.2020 21:22 |
как вектор стал двухмерным. Почему в первом цикле Layer(), а во втором Matrix(i,j); и зачем во втором цикле функцию back() используют? | diomed16 | Общие вопросы C/C++ | 1 | 01.07.2020 18:03 |
что эффективнее? | Poma][a | Помощь студентам | 6 | 10.11.2011 23:39 |
Работа в цикле | bulldog5293 | Общие вопросы Delphi | 3 | 09.08.2011 18:25 |
Цикл в цикле... | Davlet M | Помощь студентам | 6 | 25.01.2010 01:42 |