August 2021
Beginner to intermediate
450 pages
5h 40m
Chinese
理论上,开发性能测试程序是很容易的——找出一个典型的使用场景,编写一段程序多次执行这种使用场景,并统计程序的运行时间。但在实际情况中,你必须提防多种编码陷阱,它们会使性能测试变得毫无意义。
垃圾回收的执行时序是无法预测的,因此在执行测试时,垃圾回收器可能在任何时刻运行。如果测试程序执行了N次迭代都没有触发垃圾回收操作,但在第N+l次迭代时触发了垃圾回收操作,那么即使运行次数相差不大,仍可能在最终测试的每次迭代时间上带来很大的(但却虚假的)影响。
有两种策略可以防止垃圾回收操作对测试结果产生偏差。第一种策略是,确保垃圾回收操作在测试运行的整个期间都不会执行(可以在调用JVM时指定-verbose:gc来判断是否执行了垃圾回收操作)。第二种策略是,确保垃圾回收操作在测试期间执行多次,这样测试程序就能充分反映出运行期间的内存分配与垃圾回收等开销。通常第二策略更好,它要求更长的测试时间,并且更有可能反映实际环境下的性能。
在大多数采用生产者-消费者设计的应用程序中,都会执行一定数量的内存分配与垃圾回收等操作——生产者分配新对象,然后被消费者使用并丢弃。如果将有界缓存测试运行足够长的时间,那么将引发多次垃圾回收,从而得到更精确的结果。
Read now
Unlock full access