編碼我到處檢查Java的可變參數性能。Java的可變參數性能
我寫下面的測試代碼:
public class T {
public static void main(String[] args) {
int n = 100000000;
String s1 = new String("");
String s2 = new String("");
String s3 = new String("");
String s4 = new String("");
String s5 = new String("");
long t = System.currentTimeMillis();
for (int i = 0; i < n; i++) {
foo();
}
System.err.println(System.currentTimeMillis() - t);
t = System.currentTimeMillis();
for (int i = 0; i < n; i++) {
baz(s1, s2, s3, s4, s5);
}
System.err.println(System.currentTimeMillis() - t);
t = System.currentTimeMillis();
for (int i = 0; i < n; i++) {
bar(s1, s2, s3, s4, s5);
}
System.err.println(System.currentTimeMillis() - t);
}
static void foo() {
}
static void bar(String a1, String a2, String a3, String a4, String a5) {
}
static void baz(String... a) {
}
}
在我的機器的平均產量是:
78
4696
78
似乎傳遞變量的方法是不花錢?!很好!
但是使用varags的速度要慢60倍!爲什麼?
解釋可能是程序必須在堆上創建數組,並且時間是由GC支出的。但是對於少環路我仍然得到作爲輸出:
0
62
0
什麼是花這個額外的時間,反正編譯器的所有信息來解決這一個修復可變調用...
它不是我的本意以優化,但我發現這個奇怪...
更新
我添加了一個新的測試
t = System.currentTimeMillis();
for (int i = 0; i < n; i++) {
baz(s1);
}
System.err.println(System.currentTimeMillis() - t);
而這一個參數版本仍然慢30倍。也許在場景後面有一個ArrayList.toArray()?
因此,請注意代碼中的不需要的varags方法和重構來修復長度。這可能是性能提升。
是的,它將是相同的,因爲可變參數是在有效編譯之前將語法糖轉換爲數組調用。 – Riduidel 2010-03-11 16:00:59
這基本上是正確的,雖然我認爲你應該澄清,差異是可變參數需要JVM分配和填充數組。不管它堆在堆棧上還是堆棧都不是問題(雖然當然是堆在堆上)。 – 2010-03-12 09:47:53
@肖恩歐文謝謝,更新。 – 2010-03-12 09:59:21