我对Microchip PIC微控制器的组装编程有所了解,但我不是专家。
有人能给我解释一下以下3种说法中哪一种在组装中最有效(即耗时更少)吗。
x++
x = x + 1
x += 1
我对C#和Java都很熟悉,我确信当我们考虑高级编程语言时,上面3条语句的效率没有什么不同。但是,当我们考虑组装时,效率是否存在差异?
感谢
这些不是汇编语句,您在错误的抽象级别上工作。
要想弄清楚哪一个C类语句更快,需要将它们编译成程序集,然后再检查
任何一个无脑的编译器都会为这三种情况提供完全相同的代码。
如果你有一个死脑筋的编译器,那么,是的,几乎肯定会有区别,比如:
inc [memloc]
和:
lod r1, [memloc]
inc r1
sto [memloc], r1
当我们考虑高级编程语言时,上面3条语句的效率没有差异
这取决于你对"高水平"的定义。在Python或Ruby等脚本语言中,我希望x++
的性能优于x += 1
和x = x + 1
,因为x
的符号表查找最少,而且不必"开箱"标量(将脚本语言1
转换为程序集1
)。
然而,对于像C这样的编译语言,我希望这三个语句都能产生类似的汇编代码,所以它们应该同样高效。然而,这取决于编译器及其配置,例如,如果您正在执行"调试"或"发布"构建。
编译器现在足够聪明,可以找到最佳解决方案,所以实际上都是一样的。编译器会将它们转换为最快的汇编命令。所以别想这个。如果您正在编写C#或Java代码,这是您最不应该考虑的事情。
如果你在问,当在高级语言中使用时,它们是否同样有效:假设你使用了任何相当不错的编译器,它们会的。
如果你在问,如果使用类似于上述语句的三种不同的汇编指令会同样快,那么可能不会。如果你的CPU有特殊的"inc"指令,那么它可能比其他指令快一点,如果不考虑其他因素的话(现代CPU通常只需要一个周期来处理这样简单的指令),因为指令可能更短,这需要CPU从内存中传输更少的代码。要确定的是,您应该查看指令集手册,其中经常指定时间。对于某些体系结构,您还可以获得周期精确的模拟器,它应该能够回答这些类型的问题。