自己根据项目需求,写了一个同步、固定大小的可实现快速插入和删除的双向链表,然后与LinkedList、ArrayBlockingQueue进行插入性能比较,却发现了一个奇怪的现象,各个容器的性能与在程序中的顺序相关,越是排在后面执行的,性能数据超好。看下面的代码:
int SIZE = 1000000;
int INSERT = 10000;
ArrayBlockingQueue<ILinked> queue = new ArrayBlockingQueue(SIZE);
ArrayBlockingQueue<ILinked> queue1 = new ArrayBlockingQueue(SIZE);
ArrayBlockingQueue<ILinked> queue2 = new ArrayBlockingQueue(SIZE);
long start;
long during = 0;
start = System.nanoTime();
for (int i = 0; i < INSERT; i++) {
queue1.offer(new LinkTest());
}
during = (System.nanoTime() - start);
System.out.println("ArrayBlockingQueue insert " + INSERT + " object, time: " + during);
start = System.nanoTime();
for (int i = 0; i < INSERT; i++) {
queue2.offer(new LinkTest());
}
during = (System.nanoTime() - start);
System.out.println("ArrayBlockingQueue insert " + INSERT + " object, time: " + during);
start = System.nanoTime();
for (int i = 0; i < INSERT; i++) {
queue.offer(new LinkTest());
}
during = (System.nanoTime() - start);
System.out.println("ArrayBlockingQueue insert " + INSERT + " object, time: " + during);
对于这段,大家一定认为输出的结果应该相差无几,而事实却非如此,在Netbeans中结果的输出甚至相差了一个数量级,如下:

为了排除Netbeans引起的问题,编译打包后在终端下执行,结果表明越是代码后面的性能数据超好
而网上看到的对容器性能的比较,基本使用的都是这种方法。由上面的现象看出这种性能比较方法是不准确的。