Является ли x ++ более эффективным, чем x = x + 1 и x + = 1 в сборке? - PullRequest
0 голосов
/ 03 апреля 2012

Я немного знаю о программировании сборки в микроконтроллерах Microchip PIC, но я не эксперт.

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

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

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

Спасибо

Ответы [ 4 ]

3 голосов
/ 03 апреля 2012

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

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

Любой не-мозговой компилятор даст вам одинаковый код для всех трех случаев.

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

inc  [memloc]

и:

lod  r1, [memloc]
inc  r1
sto [memloc], r1
2 голосов
/ 03 апреля 2012

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

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

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

0 голосов
/ 03 апреля 2012

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

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

0 голосов
/ 03 апреля 2012

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

...