Базовая скорость C ++ (инициализация против добавления) и скорость сравнения - PullRequest
2 голосов
/ 26 марта 2010

Мне было любопытно, если кто-нибудь знает, что из следующего выполняется быстрее (я знаю, что это кажется странным вопросом, но я пытаюсь сократить как можно больше времени и ресурсов от моей программы.)

int i=0;

i+=1; 

или

int i;

i=1;

и мне также было любопытно, какое сравнение быстрее:

//given some integer i
// X is some constant
i < X+1

или

i<=X

Для тех из вас, кто уже опубликовал ответы, извините, я отредактировал его, чтобы первый раздел был правильным, я имел в виду, если я был инициализирован до 0. Опять извините за путаницу.

Ответы [ 6 ]

16 голосов
/ 26 марта 2010

Первая операция, вероятно, не имеет смысла, потому что, если i не является статическим, вы оставили i неинициализированным.

Вы заблуждаетесь и сосредотачиваетесь на неправильных вещах. Гадание никуда тебя не приведет; выявить профиль, профилировать свой код и выяснить с помощью data , какие части необходимо оптимизировать. Оптимизация - это изменения дизайна , будь то различные структуры данных или алгоритмы.

Вы сильно недооцениваете компиляторы. Ничто из того, что вы делаете, не будет иметь значения с такими крошечными изменениями, оба будут компилироваться в зависимости от того, какой компилятор решит быстрее. Если вы хотите получить целое число, просто сделайте: int i = 1; и живите своей жизнью. Если вы хотите сравнить, если целое число меньше или равно X, просто скажите: i <= X;. Написать чистый читаемый код. Кстати, ваши два сравнения не совпадают, когда X имеет максимальное значение; вы переполнитесь, когда добавите один.

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

0 голосов
/ 28 марта 2010

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

0 голосов
/ 26 марта 2010

Я предполагаю, что переменные, о которых вы говорите, являются локальными (а не глобальными).

Если это так, первое, что вы написали: int i; ... я ++; // это происходит в функции неправильно. Я бы не стал доверять этому. Когда-либо.

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

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

При сравнении, если X - переменная, то без оптимизации компилятора вы могли бы лучше справиться со второй.

Меня беспокоит микрооптимизация, и я могу заверить вас, что за исключением тупого компилятора, вы ничего не выиграете.

0 голосов
/ 26 марта 2010

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

0 голосов
/ 26 марта 2010

В первом примере , вероятно, будет лучше с int i=1;, хотя это скорее скорость, чем корректность (например, если i имеет автоматическое сохранение, int i; i+=1; даст неопределенное поведение).

Во-вторых, если есть какая-то разница, она, вероятно, предпочтет i <= X; (но есть большая вероятность, что и здесь разницы не будет).

0 голосов
/ 26 марта 2010

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

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