![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 06.01.2021
Сообщений: 52
|
![]()
Слышал, якобы префиксный инкремент эффективнее, т.к. не создаётся копия объекта.
Я провёл мини-исследование и обнаружил, что для простого цикла 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. |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,821
|
![]()
Вы идиот? Компиляторы давно делают эту оптимизацию для простых случаев + кучу других. Хотите сравнить возмите итераторы в дебаге или другие классы с копирование/доп. действиями и т.д.
|
![]() |
![]() |
![]() |
#3 |
Участник клуба
Регистрация: 03.06.2009
Сообщений: 1,869
|
![]()
а где графики, исследования на конкретных расчётных задачах с выводом времени, чтоб этот многострадальный i++ реально протестировать?
Программирование - это единственный способ заставить компьютер делать то, что тебе хочется, а не то, что приходится.
|
![]() |
![]() |
![]() |
#4 | |
фрилансер, препод.
Участник клуба
Регистрация: 11.10.2019
Сообщений: 1,035
|
![]()
iXNomad, поздравляю с открытием существования оптимизатора
![]() чтобы ещё больше удивиться возможностям оптимизаторов: Поговорим об оптимизирующих компиляторах RVO и NRVO в C++17 Цитата:
Последний раз редактировалось Алексей1153; 09.04.2024 в 07:00. |
|
![]() |
![]() |
![]() |
#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 |