案例
两周前,参与某一老产品的性能优化有如下收获:
- 同事说,我配置了 1000个线程 ,但是总消耗时间还是需要 10分钟 左右,似乎没有真正的并发。
- 经过分析代码,狂改一通代码,结果是:只配置了 32个线程 ,总消耗时间下降至 44秒 。
这个产品已有一定的年头,采用Java开发,但Maven配置的编译source/target还是 1.6(直接把配置修改为1.8整个产品编译会有问题。对于老产品,稳定优先,维护者并没有太多的动力升级到1.8,因为一升级需要对所有历史分支都升级并验证)。 为了线程安全,代码中大量地存在如下Double-Check写法(伪代码),无法享受Java高版本带来的红利,并不高效:
Description desc = cache.get(key);
if (desc == null) {
synchronized(cache) { // 这个是全局锁,极大影响并发
if (desc == null) {
desc = getDescription(....); // 此方法还会调用其它类似写法的Cache,主要逻辑是查询以及反射类,以及嵌套类,效率并不高
cache = new CopyOnWriteMap(cache) // 对象Copy
cache.add(key, desc);
}
}
}
return desc;