簡體   English   中英

總是使用最終?

[英]Always Use Final?

我已經讀過,制作最終的東西,然后在循環中使用它會帶來更好的性能,但它對一切都有好處嗎? 我有很多地方沒有循環,但我將final添加到局部變量。 它會使它變慢還是仍然好?

還有一些地方我有一個全局變量final(例如android paint),這是否意味着我在循環中使用它時不必將它作為局部最終版本?

你應該考慮的第一件事是; 我可以編寫此代碼的最簡單,最清晰的方法是什么。 這通常表現良好。

final局部變量不太可能影響性能。 當你有很長的方法時,它們可以幫助澄清,但我建議分解方法是一種更好的方法。

final領域可能會影響性能,以小的程度,但一個更好的理由,使其final是要清楚地表明這一領域從未改變(這也有助於JIT)

不要考慮性能。 對象成員(字段)上的final具有顯着的內存語義,可以提高性能(但更重要的是,它通常需要使代碼正常工作)。 你應該隨時把對象放在final對象上。 但是,對於局部變量, 只有在它可以提高代碼重新連接性時才能使用它,或者可以在維護者觸摸代碼時防止錯誤

Java社區的普遍共識是,每個局部變量的final都會使代碼難以閱讀。 在性能方面,您可以預期不會進行優化,因為編譯器很容易分析局部變量。 換句話說,編譯器可以自己解決它。

根據我的經驗,大多數變量都可以聲明為final

但是,它看起來非常難看。 這是我反對它的主要觀點。

如果程序的一部分不是性能關鍵,請注意過早優化。

這是我的2美分:

使用final on屬性來最小化可變性並出於文檔目的,如果在內部/匿名類中使用它們,則僅對局部變量使用final。

不要用它來進行微觀優化! 特別是不要在類或方法上使用它們,因為您認為它會提高性能。 使類和方法最終禁止繼承或覆蓋方法。

在可能的情況下使用final(對於字段和變量,而不是類和方法)被認為是好的形式,如果沒有其他原因,它會使測試更容易。 決賽永遠不會對表現產生負面影響。

關於屬性的最終結果不應對性能產生任何影響。 除了:在多線程環境中,多個線程訪問同一個字段,如果必須重新加載,則“不知道”。 局部變量的最終結果根本沒有影響,因為除了本地范圍之外的任何東西都無法訪問它們。 最終的方法可以在JIT編譯期間產生影響。 如果一個方法是final和small,那么編譯器可以在循環中內聯它,因為很明顯沒有人會覆蓋它。 我通常根本不使用final屬性,因為最終屬性不能輕易地從DB加載等。聲明參數方法最終lokos丑陋(我從來沒有在我的代碼中分配它們)但可能會阻止來自錯字的簡單錯誤。 但是,如果你開始為你的變量使用專有名稱,那么你就會犯這樣的錯誤。

從理論上講,如果你制作一個局部變量fi​​nal,它可以進行優化。 我不認為讓它們最終自己確實提高了性能,因為優化器可能已經檢測到當地人不會改變。 也就是說,幫助它有點傷害。

在某些情況下,將一個變量更改為兩個變量將有所幫助,例如從此變量

String a = "foo";
if (lol) a += "bar";

for(.. 1000 ...) doSomething(a);

final String a;
{
    String ma = "foo";
    if (lol) ma += "bar";
    a = ma;
}

for(.. 1000 ...) doSomething(a);

免責聲明:我不是JIT專家。

最終變量是常量,因此編譯器可以生成常量值而不是變量引用指令。 當然,這會提高速度(通常也會提高尺寸)。

還有一些地方我有一個全局變量final(例如android paint),這是否意味着我在循環中使用它時不必將它作為局部最終版本?

對不起,你的意思是你沒有:

final int somefinalvalue = 0;

void amethod() {
  final int somefinalvalue = 0; // repeated from global one
}

或者是什么? 請記住,如果您聲明與全局變量具有相同名稱的局部變量,則會“影響”全局變量。 即它實際上是一個完全不同的變量。 如果您已經擁有全局的,那就使用它。 無需重新申報。

如@ perter-lawrey所述,我認為這不應該是你的第一個問題。 首先,編譯器優化可以做很多事情; 第二,有一些工具可以分析生成的類文件並執行相同的操作,例如, ProGuard:java shrinker,optimizer,obfuscator和preverifier。

暫無
暫無

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

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