我正在運行一個小測試,雖然它是一個微基準測試,但它確實模仿了我們在生產中實際做得非常好。爲什麼此Java代碼的性能如此不一致?
我創建了一個二維數組,5列和10,000,000行,填充0-19(含)之間的隨機整數。然後,我想總結第三列中的所有數字,只要第二列的值是偶數即可。我做了100次熱身,然後再做100次,每次花費多少時間。
在我的機器上絕大多數時間大約需要9秒,但是偶爾需要6秒。
它看起來不像垃圾收集或JIT編譯。
有沒有人有任何想法,爲什麼它會非常偶然地快得多?
我運行的Linux上JDK7u11所述代碼與下列參數: - 服務器-XX:+ PrintCompilation -Xms500m -Xmx500m -verbose:GC -XX:+ PrintGCTimeStamps -XX:+ PrintGCDetails然而,使用各種不同的的JDK(從6一直到8),並刪除所有這些參數似乎並沒有顯着影響時間。
下面是代碼:
import java.util.ArrayList;
import java.util.Random;
public class JavaPerformanceTest {
public static void main(String[] args) {
int numColumns = 5;
int numRows = 10000000;
int[][] data = new int[numColumns][numRows];
Random rand = new Random(1234);
for (int j = 0; j < numColumns; j++) {
for (int i = 0; i < numRows; i++) {
data[j][i] = rand.nextInt(20);
}
}
int warmUp = 100;
ArrayList<Integer> sums = new ArrayList<Integer>();
System.out.println("warm up " + warmUp + " times");
long warmUpStart = System.nanoTime();
for (int i = 0; i < warmUp; i++) {
sums.add(sum(numRows, data));
}
long warmUpEnd = System.nanoTime();
System.out.println("warm up complete " + (warmUpEnd - warmUpStart)/1000000);
int numberOfRuns = 100;
int finalSum = 0;
long startTime = System.nanoTime();
for (int i = 0; i < numberOfRuns; i++) {
finalSum = sum(numRows, data);
}
long endTime = System.nanoTime();
long diff = (endTime - startTime)/1000000;
System.out.println("Time taken: " + diff + " Sum: " + finalSum);
}
public static int sum(int numRows, int[][] columnBased) {
int sum = 0;
for (int i = 0; i < numRows; i++) {
if ((columnBased[1][i] % 2) == 0) {
sum += columnBased[2][i];
}
}
return sum;
}
}
謝謝,尼克。