2010-08-24 3 views
5

Можно создать дубликат:
Is there a performance difference between i++ and ++i in C++?++, а, а ++ а = а + 1 и а + = 1 с точки зрения эффективности исполнения в C.Assume GCC быть компилятору

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

a++ 
++a 
a=a+1 
a+=1 
+4

Вы действительно думаете, что должны были отвечать на основании эффективности? Кроме того, ваше название и вопрос не согласны. Я угадываю и редактирую это. –

+4

Это C, или C++? Потому что в C++ вы не можете предположить, что a ++ и a + = 1 являются одной и той же операцией (или что другая будет существовать, если первая делает). –

+0

@Caleb: ... или что код даже компилируется. – fredoverflow

ответ

92

Вот что g++ -S производит:

void irrelevant_low_level_worries() 
{ 
    int a = 0; 
// movl $0, -4(%ebp) 

    a++; 
// incl -4(%ebp) 

    ++a; 
// incl -4(%ebp) 

    a = a + 1; 
// incl -4(%ebp) 

    a += 1; 
// incl -4(%ebp) 
} 

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

+70

+1 для имени функции – Bob

+2

@NullUserException: Err, нет, он отключил оптимизацию. +1 –

+0

Сделайте 'a' глобальную переменную, и тогда она не будет оптимизирована. – wilhelmtell

0

Ну, можно утверждать, что a++ коротко и по существу. Он может только увеличивать a на один, но обозначение очень хорошо понято. a=a+1 является немного более подробным (не большое дело, если у вас нет variablesWithGratuitouslyLongNames), но некоторые могут утверждать, что он более «гибкий», потому что вы можете заменить 1 или любой из a, чтобы изменить выражение. a+=1, возможно, не такой гибкий, как два других, но немного более ясный, в том смысле, что вы можете изменить количество приращений. ++a отличается от a++, а некоторые возражают против этого, потому что это не всегда понятно людям, которые его часто не используют.

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

(при условии, что a целое)

0

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

a++ 

и

++a 

не то же самое, однако, но это не связано с эффективностью.

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

+1

Да, это связано с эффективностью. С '++ a' мы просто увеличиваем a и возвращаем новое значение. С 'a ++', либо мы должны хранить 'a' в регистр, затем увеличивать' a', а затем возвращать значение в регистре или нам нужно увеличивать 'a' и возвращать новое значение минус' 1'. Это явно оптимизировано, если вы не используете возвращаемое значение. – alternative

6

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

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

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

+6

Перевод: Это глупый вопрос, на который нет значимого ответа. –

+2

@Steven Sudit: Не глупый вопрос, но бессмысленный и устаревший. Вопрос основан на условиях, которые были актуальны 10 лет назад, но сегодняшняя культура аппаратного обеспечения и программирования ставит совершенно другой фокус на то, как вы пишете код. – Guffa

+0

Я вижу вашу точку зрения, но я не уверен, что согласен. Даже в дни плохо оптимизирующих компиляторов C и скорости процессора в диапазоне низких МГц этот вопрос не имел большого значения. –

0

В интервью, я бы с двумя ответами:

  1. На первый взгляд, сгенерированный код должен быть очень похожи, особенно если это целое число.
  2. Если время выполнения было определенно известной проблемой - вы должны измерить ее с помощью какого-то профилировщика.
+0

Id изменить 2) на 2 '): если время выполнения было определенно известной проблемой, скорее всего проблема в другом месте. Итак, do 2) – Tom

1

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

3

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

То, что верно для одного языка/компилятора/архитектуры, может быть неверным для других. И в самом деле, факт в любом случае не имеет значения. Знание этих вещей не делает вас лучшим программистом.

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

Не оптимизируйте преждевременно, но также не используйте микро-оптимизацию. Посмотрите на оптимизацию больших изображений.

1

Для большинства компиляторов он должен скомпилировать тот же код ASM.

0

Это зависит от контекста, и если мы находимся на C или C++. В C код, который вы опубликовали (кроме a-- :-), приведет к компилятору C для создания точно такого же кода. Но с большой вероятностью ожидаемый ответ состоит в том, что ++ является самым быстрым, а a = a + 1 самым медленным, поскольку древние компиляторы полагались на пользователя для выполнения таких оптимизаций.

В C++ это зависит от типа a. Когда a является числовым типом, он действует так же, как и в C, что означает, что ++, a + = 1 и a = a + 1 генерируют один и тот же код. Когда a является объектом, это зависит от того, перегружен ли какой-либо оператор (++, + и =), так как вызывается перегруженный оператор объекта a.

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

+1

Почему '' ++ 'быстрее, чем' ++ a'? :) – fredoverflow

+1

@FredOverflow, Thats correct. Ответ неправильный. '++ a' всегда будет по крайней мере так же быстро, как' a ++ ', быстрее, если вам потребуется возвращаемое значение. – alternative

+0

@FredOverflow Это зависит от мнения интервьюера. – Rudi

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