簡體   English   中英

內部/外部循環中的變量聲明

[英]variable declaration inside/outside loop

如果由於某種原因我不得不使用盡可能少的內存空間,那么第二個代碼比第一個代碼好嗎? (該代碼僅供參考,沒有任何意義)。 (編輯:想象一下,我想在由JVM完成任何優化之前對此進行匯編代碼。然后與第二個過程相比,我在第一個過程中是否使用了99999998個額外的內存位置?重點只是一個內存的使用)

第一:

for(int i=0; i<99999999; i++){
    int k=2*i
}

第二:

int k=0;
for(int i=0; i<99999999; i++){
    k=2*i
}

我確定的是:

在每種情況下,差異都不可見。 如果要進行如此小的優化,那么Java當然不是最好的技術。 這使我推薦第一個,因為它使代碼更具可讀性和邏輯性。 (如果僅在變量內部使用for,則在變量外部聲明變量會很奇怪,這很令人困惑)。


我的想法:

在您的小示例中,並且您一直在尋找內存占用空間。 第一個更好,因為它遵循此注釋中提到的隱式規則:范圍越小越好。

在第一種情況下,變量k僅在很小的循環中使用。 因此,優化器將很容易理解它,並且僅使用寄存器,因此不占用內存,指令也更少。

在第二種情況下,優化器將很難確定k在其他地方未使用。 因此,它可以允許一些內存而不是使用寄存器。 然后,它將使用一些內存,並且優化程度較差,因為它將需要指令來加載和存儲內存。

如本評論中所述 ,它主要取決於您的使用方式。 在您的示例中,優化器將在兩種情況下都檢測到相同的用法,並且不使用任何內存。 但是在更難的代碼中,它不會總是找到它。 所以我建議有較小范圍的可能。

@ pranay-khandelwal的回復鏈接到用另一種語言對該問題的精彩討論。 但是,Java JVM會在運行時拋出字節碼,以嘗試獲得更好的性能,這會使事情復雜化。

實際上關於可讀性的進/出最佳實踐的類似話題實際上還在這里進行了另一次討論,從而產生了一些基准和討論,其中一位參與者在此處進行了記錄

作為一般經驗法則,第二種選擇在幾乎所有情況下都將對內存和性能更好-在前一種情況下,前一種可能更具自文檔性和可維護性,並避免在外部范圍的其他地方意外使用。

由於您提到帖子中的代碼僅是一個代表性的示例,因此它不僅可以應用於簡單類型,還可以應用於更多類型:

替換已經注冊的存儲區的內容要比注冊一個新的存儲區和取消注冊舊的存儲區(或等待它被垃圾回收)便宜。 即使語言的編譯器或解釋器巧妙地使用最近未引用的內容來存儲新內容, 工作也需要付出努力,並且開銷可以通過外部聲明來避免,盡管其他人提到,這通常是不必要的並且可能產生錯誤微觀優化。

從您提供的這些簡短示例中,第二個選項。 但是,它始終取決於代碼的邏輯。 考慮性能並最大程度地減少執行空間和時間,第二個代碼可擴展性更好,即使它看起來與某些良好的編碼實踐相反。 代碼中的K僅在循環塊內使用。 但是,它在多個“塊迭代”中被“重用”。 看一下for循環的語法,它在語句的開頭聲明iint i ); 此聲明只會發生一次。 同樣,多次聲明該變量可能會浪費時間和內存。 在一般的簡單情況下,JVM優化器可能會做得很好。 但是,它可能無法捕獲代碼(Java)的語義。

for(int i=0,k=0; i<99999999; i++){
    k=2*i
}

暫無
暫無

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

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