[英]Is ++x more efficient than x++ in Java?
在編程課上,教授教我們x++
和++x
,x是整數。
他說,在這種情況下,我們可以放置x++
或++x
, ++x
更有效(雖然很少,但理論上仍然更有效)。
但我忘記了原因 。 有誰知道? 這是Java。
它在Java中效率不高。 在遞增/遞減運算符可能過載的語言中,它可以更有效,但其他方面的性能完全相同。
之間的差x++
和++x
是x++
返回的值x
它被遞增之前,和++x
返回的值x
它被遞增后。 在代碼生成方面,兩者都彌補了完全相同數量的指令,至少當你可以互換使用時(如果你不能互換使用它們,你不應該擔心哪一個更快,你應該是選擇你需要的那個)。 唯一的區別是放置增量指令的位置。
在C ++中,類可以重載前綴( ++x
)和后綴( x++
)運算符。 當處理重載它們的類型時,使用前綴運算符幾乎普遍更快,因為后綴運算符的語義將返回對象的副本,就像它在增量之前一樣,即使你不使用它,前綴運算符可以簡單地返回對修改對象的引用(並且上帝知道C ++開發人員更喜歡返回引用而不是副本)。 這可能是考慮++x
優於x++
一個原因:如果你養成使用++x
的習慣,當你/切換到C ++時,你可以省去一些輕微的性能問題。 但僅在Java的上下文中,兩者都是絕對等價的。
與上面的注釋中的pst非常相似,我從不使用x++
或++x
的返回值,如果你從未使用過,那么你應該堅持使用你喜歡的那個。
出於好奇,您可以檢查生成的字節碼。
這個程序:
public static void main(String args[]) {
int i = 1; //bytecode 0, 1
i++; //bytecode 2
++i; //bytecode 5
int a = ++i; //bytecode 8, 11, 12
int b = i++; //bytecode 13, 14, 17
}
生成以下字節碼:
public static void main(java.lang.String[]);
Code:
0: iconst_1
1: istore_1
2: iinc 1, 1
5: iinc 1, 1
8: iinc 1, 1
11: iload_1
12: istore_2
13: iload_1
14: iinc 1, 1
17: istore_3
18: return
因此,您可以看到,從字節碼角度(除了操作的順序),前置和后置修復操作符嚴格相同。
如果JIT編譯了你的代碼部分,那么所有的賭注都會被取消。 例如,上面的代碼可以編譯為無操作,因為它沒有副作用。
問題的真相是*x++
在PDP-11上比C中的 *++x
快,可能是VAX,因為它編譯成單個指令(自動遞增寄存器延遲)。 同樣地, *--x
比*x--
快。 如果編譯器仍然生成該指令,則使用沒有取消引用的任一形式只會在一種情況下更快而不是另一種形式,這將是浪費因為仍然會發生取消引用。
那些日子已經一去不回。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.