为什么 arg = args[n++] 比早期编译器中的 2 个单独语句更有效?

Why was arg = args[n++] more efficient than 2 seperate statements in earlier compilers?

摘自书 "Core Java for the Impatient",章节 "increment and decrement operators"

String arg = args[n++];

sets arg to args[n], and then increments n. This made sense thirty years ago when compilers didn’t do a good job optimizing code. Nowadays, there is no performance drawback in using two separate statements, and many programmers find the explicit form easier to read.

我以为这样使用递增和递减运算符只是为了少写代码,但根据这个引用,过去不是这样的。

编写 String arg = args[n++] 等语句对性能有何好处?

这些运算符were/are通常被程序员用来方便而不是为了提高性能。因为实际上,该语句在编译期间会被分成两行语句!!显然,与已经拆分的两个线性语句相比,执行 Post/Pre-increment/decrement 运算符的开销会更多!

一些处理器,如摩托罗拉 68000,支持专门取消引用指针然后递增它的寻址模式。例如:

较旧的编译器可能能够在像 *p++arr[i++] 这样的表达式上使用这种寻址模式,但可能无法识别它分为两个语句。

多年来,架构和编译器变得更好。考虑到 CPU 架构和编译器的改进,我想说没有单一的答案。

架构的角度来看 - 许多处理器支持STORE & POINTER AUTO-INCREMENT作为一个CPU周期。所以在过去 - 你编写代码的方式会影响结果(一个与多个操作)。最值得注意的是 DSP 架构擅长并行处理(例如 TI DSP,如 C54xx,具有 post-递增和 post-递减指令以及可以在循环缓冲区中执行的指令 - 例如 *"ADD *AR2+, AR2–, A ;after accessing the operands, AR2 ;is incremented by one." - 来自 TMS320C54x DSP reference set). ARM cores also feature instructions that allows for similar parallelism (VLDR, VSTR instructions - see documentation )

编译器的角度来看 - 编译器查看变量如何在其作用域中使用(以前不可能是这种情况) .它可以查看该变量以后是否被重用。可能是这样的情况,在代码中变量增加但随后被丢弃。这样做的意义何在?如今,编译器必须跟踪变量的使用情况,并且可以基于此做出明智的决策(如果您查看 Java 8 - 编译器必须能够发现 "effectively final" 变量未重新分配)。