2012-04-03 4 views
0

Я немного разбираюсь в программировании сборки в микроконтроллерах Microchip PIC, но я не эксперт.Является ли x ++ более эффективным, чем x = x + 1 и x + = 1 в сборке?

Может кто-нибудь объяснить мне из следующих 3 утверждений, которые наиболее эффективны (т. Е. Меньше времени) в сборке.

x++ 
x = x + 1 
x += 1 

Я хорошо знаком как с C# и Java, и я знаю, что нет никакой разницы в эффективности выше 3 заявления, когда мы рассматриваем язык программирования высокого уровня. Но есть ли разница в эффективности, когда мы рассматриваем сборку?

Благодаря

+8

Зависит от того, как вы переводите их на сборку? – Mat

+3

Почему бы не попробовать разобрать свой код и проверить себя? Используйте опцию '-S' с gcc –

+0

Если вы знаете только немного о сборке PIC, которую вы уже знаете достаточно: это та, которая использует наименьшие строки кода. – hplbsh

ответ

3

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

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

Любой компилятор, не содержащий Braindead, предоставит вам точно такой же код для всех трех случаев.

Если есть с Braindead компилятор тогда, да, там почти наверняка будет разница между вещами, как:

inc [memloc] 

и:

lod r1, [memloc] 
inc r1 
sto [memloc], r1 
+0

Спасибо paxdiablo .. Я вижу вашу точку. Эффективность действительно зависит от компилятора, а также от набора инструкций микроконтроллера или процессора .. –

0

Составители теперь достаточно умны, чтобы найти лучшее решение, поэтому на самом деле все они одинаковы. Компилятор преобразует их в самую быструю команду сборки. Так что не думайте об этом. Это последнее, о чем вам следует подумать, если вы пишете код C# или Java.

2

нет никакой разницы в эффективности выше 3 заявления, когда мы рассматриваем язык программирования высокого уровня

Это зависит от вашего определения «высокого уровня». В языках сценариев, таких как Python или Ruby, я бы ожидать, что x++ обгоняет x += 1 и x = x + 1, так как существует минимальный символ таблицы поиска для x и не скаляр не должен быть «распакованный» (преобразовать язык сценариев 1 для сборки 1).

Для скомпилированных языков, таких как C, я бы ожидал, что все три выражения приведут к аналогичному ассемблеру, поэтому они должны быть одинаково эффективными. Однако это зависит от вашего компилятора и его конфигурации, например, если вы выполняете сборку «debug» или «release».

0

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

Если вы просите, если использовать три различные инструкции по сборке, аналогичные приведенным выше инструкциям, будут одинаково быстрыми, а затем, возможно, нет. Если у вашего процессора есть специальная инструкция «inc», то, вероятно, это немного быстрее, чем другие, если не для чего-то другого (для современных процессоров обычно требуется только один цикл для таких простых инструкций), потому что инструкция, вероятно, короче, что требует, чтобы процессор передавал меньше кода из память в долгосрочной перспективе. Чтобы быть уверенным, вы должны проверить руководство по набору инструкций, где часто задаются тайминги.Для некоторых архитектур вы также можете получить точные симуляторы, которые должны отвечать на эти вопросы.

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