有些人可能馬上會(huì )跳出來(lái),把本節的大部分內容歸于“草率的優(yōu)化”(xing:參見(jiàn)[The Root of All
Evil]),不可否認微優(yōu)化(micro-optimization。xing:代碼優(yōu)化,相對于結構優(yōu)化)的確會(huì )帶來(lái)很多問(wèn)題,諸如無(wú)法使用更有效的數據結構和算法。但是在手持設備上,你別無(wú)選擇。假如你認為Android虛擬機的性能與臺式機相當,你的程序很有可能一開(kāi)始就占用了系統的全部?jì)却?xing:內存很小),這會(huì )讓你的程序慢得像蝸牛一樣,更遑論做其他的操作了。
你也可以將本地變量聲明為"final",同樣,這也不會(huì )帶來(lái)性能的提
升。使用"final"只能使本地變量看起來(lái)更清晰些(但是也有些時(shí)候這是必須的,比如在使用匿名內部類(lèi)的時(shí)候)(xing:原文是 or you have to,
e.g. for use in an anonymous inner class)
public class Foo {int mSplat;static Foo mArray[] = new Foo[27]; public
static void zero() {int sum = 0;for (int i = 0; i < mArray.length; i++) {sum
+= mArray[i].mSplat;}} public static void one() {int sum = 0;Foo[] localArray =
mArray;int len = localArray.length;for (int i = 0; i < len; i++) {sum +=
localArray[i].mSplat;}} public static void two() {int sum = 0;for (Foo a:
mArray) {sum += a.mSplat;}}}
在zero()中,每次循環(huán)都會(huì )訪(fǎng)問(wèn)兩次靜態(tài)成員變量,取得一次數組的長(cháng) 度。 retrieves the static field twice and
gets the array length once for every iteration through the loop.
在one()中,將所有成員變量存儲到本地變量。 pulls everything out into local variables, avoiding
the lookups.
for (int n = 0; n < list.size(); n++) {if (list.items[n].e ==
MyEnum.VAL_X)// do stuff 1else if (list.items[n].e == MyEnum.VAL_Y)// do stuff
2}
替換為:
int valX = MyEnum.VAL_X.ordinal();int valY = MyEnum.VAL_Y.ordinal();int
count = list.size();MyItem items = list.items(); for (int n = 0; n < count;
n++){int valItem = items[n].e.ordinal(); if (valItem == valX)// do stuff 1else
if (valItem == valY)// do stuff 2}
會(huì )使性能得到一些改善,但這并不是最終的解決之道。
將與內部類(lèi)一同使用的變量聲明在包范圍內
請看下面的類(lèi)定義:
public class Foo {private int mValue; public void run() {Inner in = new
Inner();mValue = 27;in.stuff();} private void doStuff(int value)
{System.out.println("Value is " + value);} private class Inner {void stuff()
{Foo.this.doStuff(Foo.this.mValue);}}}
這其中的關(guān)鍵是,我們定義了一個(gè)內部類(lèi)(Foo$Inner),它需要訪(fǎng)問(wèn)外部類(lèi)的私有域變量和函數。這是合法的,并且會(huì )打印出我們希望的結果"Value
is 27"。