簡體   English   中英

聲明變量多次會減慢執行速度嗎?

[英]Does declaring a variable many times slow down the execution?

在這三個來源之間,效率方面是否存在差異?

for (int i=0; i<N; i++)
    int j = whatever();

int j;
for (int i=0; i<N; i++)
    j = whatever();

int i, j;
for (i=0; i<N; i++)
    j = whatever();

謝謝。

PS:顯然我的問題不是參考變量的范圍而是僅僅考慮循環的效率,特別是前兩種情況,其中變量j被聲明為1次而非N次。

聲明變量對性能沒有影響。 編譯代碼后,JIT足夠智能,可以預先分配局部變量。

從技術上講,限制變量的范圍可以提高性能,因為它不需要在不再需要變量后保留變量,但我懷疑JIT是否足夠聰明以便能夠解決這個問題。

聲明變量會影響編譯時間,而不會影響運行時間。 局部變量將在堆棧上占用的空間在編譯時分配,因此運行時不會受到影響。

受影響的是可讀性:通常,最好將變量聲明到它們被使用的地方附近,並將它們保持在程序允許的范圍內。 從這個意義上講,您的第一個代碼段是最好的。

使用片段2或3的唯一原因是在循環結束需要變量ij的值時,例如,找出何時執行break語句。 從您的示例中無法判斷是否是這種情況。

一旦代碼由編譯器優化,應該沒有區別。

如果您在調試模式下運行默認優化已關閉,如果在循環范圍內聲明變量,則它比在循環范圍外聲明變量效率低。

在這種情況下,對於循環的每次迭代,代碼將在堆棧上為變量創建空間,並且在迭代之后它將被丟棄。 這效率稍低。

但是對於循環變量(i),你在for循環或內部之前聲明它並不重要,因為它只在堆棧上分配一次。

因此,在調試模式下,2和3的性能優於1.並且在發布模式下,所有3都是相同的。

不需要。您需要了解代碼是否已編譯為字節碼,然后在Java虛擬機(JVM)上運行,后者將字節碼轉換為機器代碼並在即時(JIT)上進行優化。

許多簡單的事情如多變量聲明在編譯到字節碼或JIT期間都被優化掉了。

我希望我能把你鏈接到一篇很好的文章,但我沒有想到的。

他們實際上都是一樣的。 它們之間的唯一區別在於,在第二個示例中,一個變量的作用域位於循環之外,而在第二個示例中,兩個變量的作用域都在循環之外。 在你的第一個例子中,這兩個變量都不能在循環之外訪問,這使得它通常是在循環中處理變量的更好方法,除非有理由在它之外訪問它們。

int x = 0;

只需要JVM將原始32位值0分配給與x關聯的內存中的位置。 但是,在這種情況下使用自動裝箱會很有趣,因為Integer x = 0要求JVM實例化一個具有更多資源需求的新對象。

在第一個例子中,變量將初始化N次。

基本上,三個例子之間沒有顯着差異。 取決於您是否需要更廣范圍的j變量。 這使得主要區別。

如寫? 沒有。

是否有區別重要的情況? 是。

這些情況經常出現在編譯器無法為您處理的情況下嗎? 沒有。

在任何一種情況下,最好的辦法是測試它。 回答(並幫助)“為什么這比那個慢?”更容易回答(和幫助)

在效率方面,這三個例子沒有區別。但是根據編碼標准,你應該在只需要時聲明變量。 Alsothere在變量的可見性方面存在差異。 讓我解釋

選項1

 for (int i=0; i<N; i++)
int j = whatever();

這里變量j的范圍僅在for循環中

選項2

int j;
for (int i=0; i<N; i++)
    j = whatever();

這里j在for循環的內部和外部都可見但是我只能在for循環的范圍內看到

選項3

int i, j;
for (i=0; i<N; i++)
    j = whatever();

這里變量i和j在兩個地方都可見,即for循環的外部和內部

除非您執行此代碼片段數百萬次,否則答案是選擇最易讀 (因此也是最易維護的 )源代碼。

即使上述技術之一明顯更快,大多數代碼(超過90%)也不會經常執行,因此其速度與整體程序性能無關。 專注於編寫可讀,易懂和可維護的代碼。 然后,您可以優化實際導致性能瓶頸的代碼的10%(或更少)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM