Java 线程(5)- 性能测试

2019-01-27  本文已影响11人  skeeey
Ottawa, Canada by @marcojodoin

Avoid premature optimization. First make it right, then make it fast - if it is not already fast enough

衡量性能的指标

Amdahl定理

Amdahl's law describes how much a program can theoretically be sped up by additional computing resources, based on the proportion of parallelizable and serial components.

Speedup\leq\frac{1}{F + \frac{(1 - F)}{N}}

N 无限大时,SpeedupF 成反比, 也就是如果程序或应用中大部分是不可并行执行的,即使增加再多的计算资源, 程序的性能也不可能获得很大的提升。相反,如果程序中的任务完全可并行执行,即 F=0(现实世界中,这样的程序是不存在的, 任何一个程序中都含有一些不可并行化的部分),那么 Speedup = N,即可通过增加计算资源,来获得很大的性能提升。因此, 仔细的分析程序中不可并行化的部分(如一些隐含的不可并行的部分:从任务队列中取任务,计算结果的汇集,等)对性能提升是很重要的。

影响线程开销的因素

  1. 减小锁被持有的时间,即缩小锁的范围,快进快出,尽可能的缩小 synchronized 块的范围,尤其是在保证程序正确的情况下, 尝试把计算和阻塞(如I/O)操作移出 synchronized
  2. 减小锁被请求的频率,如对不相关的独立状态变量,用不同的锁进行守护、尝试将一个容器(如:ConcurrentHashMap)进行拆分,然后使用不同的锁对拆分后的片段进行守护, 但该技术有一定的副作用,如:很难对整个容器进行加锁,因此可能在一定程度上带来可见性的问题、避免在频繁调用的代码上加锁和避免使用排他锁(Exclusive Locks)

测试

The goal of testing is not so much to find errors as it is to increase confidence that the code works as expected

制定测试计划

测试的方法

避免测试中的陷阱

  1. GC,要求运行测试的时间足够长,以保证 JVM 有 GC 的发生
  2. 动态编译,同样要求运行测试的时间足够长,即 JVM 的预热,并且应该舍去第一运行的数据
  3. 关注 JVM 对代码的优化,主要集中在两个方面,一是测试程序对代码的覆盖率,另一个是避免 JVM 将一些测试基准当做 dead code 优化掉, 要求测试总在 -server 下运行
  4. 尽量的模仿实际情况

分析测试结果

上一篇下一篇

猜你喜欢

热点阅读