2017-08-03 44 views
0

以下Java示例是否會在任何JVM中創建堆分配(p.position.xp.position.y是浮動)?基元類型之間是否可以導致堆分配?

p.position.x = (float)(Math.cos(radians) * 30) + x; 
p.position.y = (float)(Math.sin(radians) * 30) + y; 

而且同樣具有以下隱例如:

float tempX = 0; 
float tempY = 0; 

tempX += (Math.cos(p.currentOrbitDegrees) * 30) + x; 
p.position.x = tempX; 

tempY += (Math.sin(p.currentOrbitDegrees) * 30) + y; 
p.position.y = tempY; 

此外,將一個方法可能比在所有的JVM其他更快嗎?

+3

「堆分配」否「一種方法可能會比另一種快」否。如果有,編譯器會優化它。 – Michael

+0

東西告訴我堆分配錯誤來自你的代碼中的其他地方 –

+0

@Michael你應該把它作爲這個問題的答案。 –

回答

1

問題中的代碼都不會導致堆分配。

一般而言,僅例其中轉換可能導致堆分配被拳擊和能夠與串並置運算符(+)發生時,其中一個操作數是不是一個String轉換。

此外,在所有JVM中,一種方法可能會比另一種方法更快嗎?

不,這不太可能。跨越「所有」JVM。

在某些平臺上的JIT會優化冗餘初始化而不是在其他平臺上,這似乎是合理的。因此,這兩個片段的相對性能將取決於平臺。

(事實上,它是可能的差異可能是老足夠的JVM顯著;即當的JIT編譯器是新的技術......或之前)。

但是:

  • 的如果我們考慮尚未發佈/預發佈的未來版本的Java,整個問題在客觀上是無法回答的。

  • 你不應該依賴別人對此的直覺。要科學。基準您的應用程序並在多個平臺上運行它。然後使用分析器來決定是否值得優化代碼的這一部分。


但對於您所提供的例子,第一個版本是寫代碼明顯的,簡單的方法,因爲這個原因,應首選


1 - 從技術上講,這些轉換不會被類型轉換本身完成,但是他們之前或一個類型轉換中指定一個加寬或變窄轉換後可能發生。

相關問題