java性能测试中遇到的奇怪现象

通过对比自定义双向链表与标准容器LinkedList、ArrayBlockingQueue的插入性能,发现容器性能受其在程序中出现顺序的影响,顺序越后的容器表现性能越好。这与常规预期不符,提示在进行容器性能比较时需要注意测试方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自己根据项目需求,写了一个同步、固定大小的可实现快速插入和删除的双向链表,然后与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引起的问题,编译打包后在终端下执行,结果表明越是代码后面的性能数据超好

而网上看到的对容器性能的比较,基本使用的都是这种方法。由上面的现象看出这种性能比较方法是不准确的。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fengdavid

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值