考慮以下兩個代碼示例。所有基準測試均在容器外部進行,用於計算採樣執行時間的平均值。在運行Windows 7和JDK 1.6的機器上,我看到示例2中的平均執行時間比示例1慢了近1000倍。我可以推測的唯一解釋是編譯器正在優化LinkedList使用的一些代碼,損害了其他一切。有人能幫助我理解這一點嗎?Java JIT編譯器是否犧牲性能來支持集合?
例1:使用數組
public class TimingTest
{
static long startNanos, endNanos;
static long[] samples = new long[1000];
public static void main(String[] args)
{
for (int a = 0; a < 100; a++)
{
for (int numRuns = 0; numRuns < 1000; numRuns++)
{
startNanos = System.nanoTime();
long sum = 0;
for (long i = 1; i <= 500000; i++)
{
sum += i % 13;
}
endNanos = System.nanoTime() - startNanos;
samples[numRuns] =(endNanos);
}
long avgPrim = 0L;
for (long sample : samples)
{
avgPrim += sample;
}
System.out.println("Avg: " + (avgPrim/samples.length));
}
}
}
示例2:使用一個LinkedList
public class TimingTest
{
static long startNanos, endNanos;
static List<Long> samples = new LinkedList<Long>();
public static void main(String[] args)
{
for (int a = 0; a < 100; a++)
{
for (int numRuns = 0; numRuns < 1000; numRuns++)
{
startNanos = System.nanoTime();
long sum = 0;
int index = 0;
for (long i = 1; i <= 500000; i++)
{
sum += i % 13;
}
endNanos = System.nanoTime() - startNanos;
samples.add(endNanos);
}
long avgPrim = 0L;
for (long sample : samples)
{
avgPrim += sample;
}
System.out.println("Avg: " + (avgPrim/samples.size()));
}
}
}
鏈接列表的性能特徵比數組的性能更差,但沒有太大的意義。 – vemv
LinkedList沒有被基準測試! LinkedList僅存儲基準測試結果。 – user1975105
@vemv這是一個不完整和誤導性的分析。鏈表具有比數組更好的性能特徵。另外,在第二個例子中,總結代碼的執行時間較慢,這個問題很明顯。 –