Что более эффективно i ++ или ++ i?

Exact Duplicate : есть ли разница в производительности между i ++ и ++ i в C ++?
Точный дубликат : разница между i ++ и ++ i в цикле?


Что более эффективно i ++ или ++ i?

Я использовал это только в Java и C / C ++, но я действительно прошу все языки, на которых это реализовано.

В колледже у меня был профессор, который показал нам, что ++ я был более эффективным, но прошло уже пару лет, и я хотел бы получить информацию от сообщества SO.

i ++:

  • создать временную копию i
  • приращение i
  • вернуть временную копию

++ i:

  • приращение i
  • вернуть i

При использовании оптимизаций вполне возможно, что результирующая assembly идентична, однако ++ i более эффективен.

edit: имейте в виду, что в C ++ я могу быть тем объектом, который поддерживает префикс и postfix ++. Для сложных объектов временная стоимость копирования не является незначительной.

Я бы посмотрел в другом месте для потенциала оптимизации.

Вот что думает о префиксе C ++ vs. postfix incrementer

Эффективность не должна вас беспокоить: это значение . Эти два варианта не совпадают, если они не являются автономными: один использует предварительное использование значения, другое сообщение.

int i; i = 1; cout << i ++; // Возвращает 1

int i; i = 1; cout << ++ i; // Возвращает 2

Когда значение не важно, большинство компиляторов переведут как ++ i, так и i ++ (скажем, в цикле for) в один и тот же код машины / VM.

Это не важно в современном компиляторе.

int v = i++; 

такой же как

 int v = i; i = i + 1; 

Современный компилятор обнаружит, что v не используется, а код для вычисления v является чистым (без побочных эффектов). Затем он удалит v и код назначения и сгенерирует это

 i = i + 1; 

Это имеет значение! Особенно, если вы на C ++ …

 ++i // the prefered way, unless.. auto j = i++ // this is what you need 

Вы всегда должны использовать префиксную нотацию, чтобы избежать необходимых накладных расходов на копирование, и с C ++ это важно!

Ну, в C ++ я считаю, что у них разные способы использования, в зависимости от того, когда вы хотите обновить переменную. Эффективность не должна определять, когда вы используете один над другим, но я бы предположил, что они будут иметь такую ​​же эффективность в любом случае.

++ i потенциально более эффективен для нетривиальной реализации оператора ++, но даже в этом сценарии компилятор может оптимизировать промежуточное временное.

++ Мне не нужна временная переменная для хранения вещей. Думайте о них вот так:

++ я

 int preIncrement(int i) { i = i + 1; return i; } 

я ++

 int i = 5; // as an example int postIncrement(_i) { int temp = _i; i = _i + 1; return temp; } 

Видеть? Постинъект требует временную переменную. Предполагая, что компилятор не сортирует все это для вас, что почти наверняка делает.

Конечно, важнее программная логика; вы рискуете столкнуться с печальной трагедией в тесте микро-оптимизации, если вы слишком беспокоитесь об этом … 🙂

Если я чего-то не упускаю, они должны иметь такую ​​же эффективность. Они должны привести к одной команде добавления. Речь идет только о том, где происходит инструкция добавления: в начале или в конце строки кода.

Нет никакой разницы. Используйте конструкцию, которая имеет наибольший смысл.

Если ваше приложение работает медленно, я могу гарантировать, что он никогда не будет из-за различий в скорости в операции целочисленного увеличения. Если это так, это серьезная ошибка в компиляторе. Проблемы со скоростью в вашем приложении будут являться алгоритмической неэффективностью, ожидающей ввода-вывода и т. Д.

Не беспокойтесь о проблемах, которых у вас нет. Преждевременная оптимизация – это корень всего зла.

++i быстрее, потому что i++ должен хранить i , затем увеличивать его, а затем возвращать сохраненное значение i . ++i просто увеличивает его, i затем возвращает его.

 // ++i i += 1; return i; // i++ temp = i; i += 1; return temp; 

Автономный «i ++»; или “++ i;” должен генерировать одинаково эффективный код. Разница возникает, если вы используете ее в выражении, где «побочный эффект» вступает в игру.

Тем не менее, было время, назад, когда «весь мир Vax», и компиляторы были сосать, что ++ я сказал, что он более эффективен, чем i ++, даже в «for (i = 0; i

Этот вопрос stackoverflow имеет отличный ответ: есть ли разница в производительности между i ++ и ++ i в C?

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

Нет правильного или неправильного ответа

Поскольку это зависит от

1) как он был реализован компилятором

2) что Cpu система работает

3) Если я байт или я двойное слово

В общем, более эффективно использовать ++ i, чем i ++. Простая причина этого в том, что ++ i совершенно то же самое, что

i + = 1;

который для x86 представляет собой одну инструкцию (и, вероятно, большинство других широко используемых архитектур). i ++, однако, равно

tmp = i; i + = 1;

Это связано с тем, что старое значение «i» соответствует i ++. И, очевидно, это требует больше работы, чем просто i + = 1;

Но, как указано выше, это практически не влияет на достаточно умный компилятор, поскольку он оптимизирует неиспользуемые операции. Для многих интерпретируемых языков (пример: PHP), вероятно, минимальное увеличение скорости для ++ i; Но это увеличение незначительно.

Как правило, в c ++ постфикс потребует дополнительной конструкции объекта, увеличенного, тогда как префикс применяется непосредственно к объекту. (Или так я читал)

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

++ i занимает менее 1 процессорную инструкцию, чем i ++ в сборке x86 без оптимизации

Обычно проще набирать i ++, следовательно, он более эффективен с точки зрения производительности.

Серьезно, однако, если i является родным типом данных (например, int, double и т. Д.) – никакой разницы.

И это зависит от реализации, если это пользовательский тип, такой как

 class Type { Type& operator ++(){} const Type& operator ++(int i){} }; T i; 

Это зависит от контекста, например:

 x = i++ 

В этом случае «x» будет равно «i», и только после этого «i» будет увеличено на единицу.

 x = ++i 

В этом случае «i» будет увеличиваться на единицу, а затем новое значение «x» будет присвоено «x».

В случае цикла «for» существует небольшая очевидная разница, отличная от производительности (++ i быстрее).

Трудно ответить на это, поскольку это зависит от реализации компилятора / интерпретатора.

Но, вообще говоря, вы можете сказать примерно расширение i ++ следующим инструкциям:

 COPY i to tmp INCREMENT tmp SAVE tmp as i 

В то время как ++ i будет примерно соответствовать:

 LOAD i INCREMENT i 

Вы не можете просто сказать, что ++ i быстрее, чем i ++, поскольку реализация языка довольно умна, и они могут оптимизировать эти инструкции, когда вы знаете, что вы не получите доступ к временному значению i ++. Обычно это происходит, например, в цикле for. Поэтому во многих случаях это одно и то же.

Если вы пытаетесь выполнить такую ​​микро-оптимизацию, я бы посоветовал вам профилировать / измерить, прежде чем выбирать один над другим.

  • Производительность MongoDB по агрегационным запросам
  • Отсутствие повышения производительности после использования openMP в программе оптимизируется для последовательного запуска
  • Выполнение qsort vs std :: sort?
  • Каков самый быстрый способ слияния / объединения data.frames в R?
  • Когда и почему базы данных объединяются дорого?
  • Почему XCHG reg, reg 3 инструкции по микрооперации на современных архитектурах Intel?
  • Заголовок Content-Length по сравнению с закодированным кодированием
  • Как определить скорость процессора Android?
  • MyISAM против InnoDB
  • Храните PostgreSQL от выбора плохого плана запроса
  • Внедрение средства просмотра журналов с помощью WPF
  • Interesting Posts

    Как я могу экспортировать все адреса электронной почты, которые я отправил из Outlook или любого другого почтового клиента?

    Как суммировать все значения в столбце в Jaspersoft iReport Designer?

    Проблемы с импортом проекта в Android Studio в отношении ActionBarSherlock

    Как вы определяете пространство имен функции?

    История за названием «String»

    Использование нескольких версий одной и той же библиотеки DLL

    socket.io и выразить 4 сеанса

    Использование iptables для перенаправления IP-адреса

    Как я могу заставить desktop.ini работать в сетевых локациях?

    Как создать собственный шаблон шаблона в ASP.NET MVC 3?

    Измените HTML-код iFrame на jQuery?

    разница между prop () и attr () в jQuery и когда использовать attr () и prop ()

    Поверните простую C # DLL в компонент COM-взаимодействия

    Простая командная строка для загрузки удаленного артефакта maven2 в локальный repository?

    Регулярное выражение позволяет вводить цифры и одну точку

    Давайте будем гением компьютера.