Java性能测试原则(一):测试真实应用

程序性能测试在企业开发中是必不可少的,在实际应用中,性能测试方法主要分为四个原则:测试真实应用、理解批处理流逝时间,吞吐量和响应时间、用统计方法应对性能的变化、尽早频繁测试;首先说说测试真实应用这一个测试原则。

性能测试比较流行的分为三种:微基准测试、宏基准测试、介基准测试;

1. 微基准测试

微基准测试顾名思义就是测量一小部分代码单元的性能,包括调用同步方法的用时和非同步方法的用时比较,创建线程的代价和使用线程池的代价,执行一种算法的耗时和替代其实现的耗时比较等等; 

微基准测试看起来很好,但是要写对却是很难。看下面代码,为了测试for循环调用方法的性能,写了下面代码:

public void doTest{
    double num;
    long then = System.currentTimeMillis();
    for (int i = 0; i < nLoops; i++){
        num = fibImpl(100);
    }
    long now = System.currentTimeMillis();
    System.out.print("Elapsed time :" + (now - then))
}

上面是微基准测试的测试代码,其中filImpl方法的代码此处省略,上面代码看起来没有问题,也非常简单,但是却存在很多问题。

1.1 必须使用被测的结果

上面的测试代码问题很大,实际上上面的代码永远也不会改变程序的任何状态,因为上面测试的num参数从来没有被使用;也就是说上面代码的for循环被消除了(至于循环被消除的概率,不知道的自己补补课,这里就不做细说了),所以说不管循环被执行了多少次,最后的结果只有几毫秒;

解决上面问题比较简单的方法就是读取被测结果,而不是简单的写操作;也就说将num从局部变量变成实例变量,并且使用volatile关键字修饰,就能测试上面方法的性能了。

1.2 不包括无关的操作

上述测试,还存在一个隐形问题,如果方法有规律,那么有些循环就是迭代多余的,那么编辑器忽略这些迭代,解决这个问题的办法是,给方法传入不同的参数,保证每次都能循环执行;所以说微基准测试的输入参数必须提前计算好。

1.3 必须输入合理的参数

上面测试方法还有一个隐患,就是输入值的范围,随机数的选择对于上述返回结果并不具有代表性,所以我们应该为常见的场景进行优化;

总结:微基准测试的比较难于编写代码,并且即使写了,真正管用的非常有限;所以在实际的开发和性能调优的选择上,必须了解了所有的隐患之后,再选择是不是现则微基准测试。

你可能感兴趣的:(Java,性能测试,Java筑基)