用stack變量優(yōu)化Java代碼
- 發(fā)布于:2024-01-26
- 共 192 人圍觀
我們寫一個Java類,在其內(nèi)部方法中定義的局部變量或?qū)ο笫谴鎯υ趕tack(堆棧)中的,且JVM是一種stack-based的,因此訪問和操縱stack中的數(shù)據(jù)時性能最佳。而Java類的instance變量(這個類的field)和static變量是在constant pool(常量池)中存儲和得到訪問的。constant pool中保存了所有的符號引用(symbolic references),指向所有型別(types)、值域(field),以及每個型別所使用的所有函數(shù)(mothods)。訪問instance和static變量時,由于它們存放于constant pool中,所以JVM需要使用更多更耗時的操作碼(分析程序生成的bytecode可以看出來)來訪問它們。
下面給出一段代碼示例,對比后說明怎么盡可能地使用stack變量:
package test;
public class StackVars {
private int x; // instance變量
private static int staticX; //static 變量
public void stackAccess(int val) { //訪問和操作stack變量j
int j = 0;
for (int i = 0; i < val; i++) {
j += 1;
}
}
public void instanceAccess(int val) {//訪問和操作instance變量x
for (int i = 0; i < val; i++) {
x += 1;
}
}
public void staticAccess(int val) {//訪問和操作static變量staticX
for (int i = 0; i < val; i++) {
staticX += 1;
}
}
}
經(jīng)測試,發(fā)現(xiàn)運行instanceAccess()和staticAccess()方法的時間大約相同,但卻比運行stackAccess()方法慢了2~3倍。因此我們對instanceAccess()、staticAccess()兩個方法的代碼作以下調(diào)整,以得到更快的性能:
public void instanceAccess(int val) {//訪問和操作instance變量x
int tempX=x;
for (int i = 0; i < val; i++) {
tempX += 1;
}
x=tempX;
}
public void staticAccess(int val) {//訪問和操作static變量staticX
int tempStaticX=staticX;
for (int i = 0; i < val; i++) {
tempStaticX += 1;
}
staticX=tempStaticX;
}
改善之處就是將instance和static變量放到循環(huán)之外,而用一個stack變量來完成多次局部運算,最后再將這個stack變量的值傳回instance或static變量,從而提高了代碼的性能。
轉(zhuǎn)載請說明出處:六百號技術(shù) - SEO優(yōu)化,網(wǎng)頁設(shè)計,網(wǎng)絡(luò)編程,軟件技巧,網(wǎng)絡(luò)知識,系統(tǒng)技術(shù) ? 用stack變量優(yōu)化Java代碼
標簽: