如何在java中对方法执行时间进行基准测试?

2022-08-31 19:51:15

我有一个程序,我自己用java编写,但我想测试方法执行时间并获得特定方法的时间。我想知道这是否可能,也许通过某种方式的日食插件?或者插入一些代码?

我看,这是一个很小的程序,不超过1500行,哪个会更好专用工具还是?System.currentTimeMillis()


答案 1

除了使用探查器之外,获取所需内容的一种简单方法如下:

public class SomeClass{
   public void somePublicMethod()
   {
       long startTime = System.currentTimeMillis();
       someMethodWhichYouWantToProfile();
       long endTime = System.currentTimeMillis();
       System.out.println("Total execution time: " + (endTime-startTime) + "ms"); 
   }
 }

答案 2

如果瓶颈足够大,可以使用探查器进行观察,请使用探查器。

如果你需要更高的准确性,衡量一小段代码的最佳方法是使用Java微板标记框架,如OpenJDK的JMHGoogle的Caliper。我相信它们像JUnit一样简单易用,不仅您将获得更准确的结果,而且您将从社区获得专业知识以正确完成它。

遵循 JMH 微基准标记来测量 以下各项的执行时间:Math.log()

private double x = Math.PI;

@Benchmark
public void myBenchmark() {
    return Math.log(x)
}

使用 and 进行测量有许多限制:currentMillis()nanoTime()

  1. 它们具有延迟(它们也需要时间来执行),这会使您的测量产生偏差。
  2. 它们的精度非常有限,这意味着您可以在Linux中从26ns到26ns以及Windows中300左右的东西进行测量
  3. 预热阶段没有被考虑在内,使您的测量值波动很大。

Java中的和方法可能很有用,但必须非常谨慎地使用,否则您可能会遇到错误的测量错误,例如测量片段的顺序会影响测量,或者像这样,作者错误地得出结论,在不到一毫秒的时间内执行了数百万次操作,而实际上JMV在制作和提升代码的地方实现了任何操作, 根本不运行任何代码。currentMillis()nanoTime()

这是一个很棒的视频,解释了如何以正确的方式进行微基准标记:https://shipilev.net/#benchmarking


推荐