2015-03-21 4 views
1

Мне очень любопытно узнать, какой из них работает быстрее всего в CPU от i++, и i=i+1 и как я могу измерить время их выполнения?i ++, i = i + 1 и i + = 1, который быстрее?

+0

какой cpu вы имеете в виду? Каков тип 'i'? –

+0

здесь i - целочисленный тип и любой процессор. – user3928757

+5

Есть вероятность, что если 'i' помечен как' volatile int', тот же код создается для всех трех, и нет никакой разницы во времени выполнения. –

ответ

1

Возьмите отметку времени и выполните одно из них в цикле и метке времени, когда вы выходите из цикла. Петля 1 миллион раз и сравните результаты для каждого цикла (например, один временной цикл для каждого другого типа). Если вы используете встроенную систему или что-то очень медленное, уменьшите количество итераций. Вам просто нужно достаточно циклов, чтобы добиться заметной разницы.

Компиляторы разные, и они оптимизированы. Хороший компилятор, вероятно, генерирует один и тот же код для каждого, поэтому вы не увидите никакой разницы.

Используйте функцию генерации временного штампа с наивысшим разрешением, предоставляемую вашей ОС (например, микросекунды или наносекунды). Если вы не можете получить достаточно высокую временную метку разрешения, увеличьте количество повторений, чтобы вы могли провести значимое сравнение.

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

+0

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

+0

Хорошая точка. Вы можете отрицательно оценить его, чтобы повысить его приоритет или даже поднять его в класс планирования в реальном времени, в зависимости от ОС * NIX. Вы также можете запускать программу много раз и принимать среднее значение.Но если вы цикл в течение значительного количества раз, то средние должны быть достаточно близки, потому что ОС не будет иметь тенденцию прерывать один цикл больше, чем другой. Но это означает, что наносекундное разрешение не даст дополнительной точности. – clearlight

1

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

+0

Я бы добавил, что в зависимости от кода уровня оптимизации может отличаться, и код вокруг этой команды будет влиять (из-за кеша, гиперпотока и т. Д.) Сгенерированный код тоже –

4

Ну, сначала человечество придумало следующую запись.

i = i+1; 

затем вместе с ДОСТИЖЕНИЕМ в аппаратных средствах mainkind изобрел следующую запись

i += 1; 

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

++i; 

и

i++; 

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

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

+0

действительно зависит от уровня оптимизации компилятора –

+0

@Lashane Я уверен, что ты неправ. Может быть, для некоторого компилятора это зависит от уровня оптимизации, но для хороших компиляторов это не зависит. Это просто формальные записи о тех же инструкциях mchine. –

+0

@ Lashane: Важная часть заключается в том, что у нее нет причин * полагаться на оптимизацию компилятора. – AnT

Смежные вопросы