转自:http://blog.csdn.net/jackpk/article/details/49634577

服务端原本有个定时任务对一个集合ArrayList 中的消息做处理。 因为考虑到处理消息是先进先出原则,所以优化的时候考虑改用ConcurrentLinkedQueue 当时没仔细深入研究过这个集合就匆匆上线了。结果刚上线第二天就出问题了。服务端一次优化演变成了一个缺陷,还好及时回退了版本,后果才不是很严重。回退后对ConcurrentLinkedQueue 做了一个简单的测试代码,如下:

 import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; public class ConcurrentLinkedQueueTest { private static ConcurrentLinkedQueue<Integer> queue = new ConcurrentLinkedQueue<Integer>(); private static int count = 100000; private static int count2 = 2; // 线程个数 private static CountDownLatch cd = new CountDownLatch(count2); public static void dothis() {
for (int i = 0; i < count; i++) {
queue.offer(i);
}
} public static void main(String[] args) throws InterruptedException {
long timeStart = System.currentTimeMillis();
ExecutorService es = Executors.newFixedThreadPool(4);
ConcurrentLinkedQueueTest.dothis();
for (int i = 0; i < count2; i++) {
es.submit(new Poll());
}
cd.await();
System.out.println("cost time " + (System.currentTimeMillis() - timeStart) + "ms");
es.shutdown();
} static class Poll implements Runnable {
@Override
public void run() {
//while (queue.size() > 0) { // 效率低,每次都需要计算整个队列的个数
while (!queue.isEmpty()) {
System.out.println(queue.poll());
}
cd.countDown();
}
}
}

运行结果:

  costtime 2360ms

改用while (queue.size() > 0)后运行结果:

  cost time 46422ms

结果居然相差那么大,看了下ConcurrentLinkedQueue的API 原来.size() 是要遍历一遍集合的,难怪那么慢,所以尽量要避免用size而改用isEmpty().

总结了下, 在缺乏性能测试的情况下,对自己的编程要求更加要严格,特别是在生产环境下更是要小心谨慎。

最新文章

  1. JavaScript 的面向对象
  2. ios开发xcode中设置代码块
  3. Android权限列表permission说明
  4. HDU 4647 Another Graph Game(贪心)
  5. Uva 11754 Code Feat
  6. 第四周 更新Scrum站立会议
  7. Oracle 11g R2 常用配置与日志的文件位置
  8. Angular基础教程:表达式日期格式化[转]
  9. linux网络编程之TCP/IP基础
  10. Bash启动选项
  11. Dancing Links 学习笔记
  12. GMA Round 1 三角形
  13. [math] 我对对数的最新理解
  14. leetcode207
  15. 《蹭课神器》Beta版使用说明
  16. RCNN
  17. [qt]qstring和string中文支持转换问题
  18. Redis简单生产者消费者
  19. c++之enum(枚举)可以没有枚举名
  20. 简单使用DESeq做差异分析

热门文章

  1. 【硅谷问道】Chris Lattner 访谈录(下)
  2. 记录-UEFI启动的预装WIN8的笔记本里引导linux双系统
  3. 【内核】linux2.6版本内核编译配置选项(二)
  4. spark编译报错信息简介
  5. idea 在tomcat中部署的时候 莫名其妙的错误
  6. iOS开发:一个高仿美团的团购ipad客户端的设计和实现(功能:根据拼音进行检索并展示数据,离线缓存团购数据,浏览记录与收藏记录的批量删除等)
  7. 好用的vim插件
  8. spring batch中MyBatisPagingItemReader分页使用介绍
  9. DLL封装Interface(接口)(D2007+win764位)
  10. 基于jQuery环形图标菜单旋转切换特效