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

KP6*_*P65 44 java optimization

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

我知道,这是一个相当小的程序,不超过1500行,这将是一个更好的专用工具或System.currentTimeMillis()

非常感谢

Chr*_*ght 46

除了使用分析器之外,获得所需内容的简单方法如下:

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

  • 这是测量Java中小块代码执行时间的最糟糕的方法之一,因为(i)不会使代码热身,使得测量值波动太多,无法有效地测量任何内容(ii)可能会受到DCE的影响实际代码中没有出现的CP和其他优化(iii)millis的粒度极其粗糙.检查我的答案以获得更好的方法. (2认同)

El *_*rce 22

如果瓶颈大到足以使用分析器观察,请使用分析器.

如果您需要更高的准确性,测量一小段代码的最佳方法是使用Java微基准框架,如OpenJDK的JMHGoogle的Caliper.我相信它们和JUnit一样简单,不仅可以获得更准确的结果,而且您​​将从社区获得专业知识.

遵循JMH微基准测试来测量执行时间Math.log():

private double x = Math.PI;

@Benchmark
public void myBenchmark() {
    return Math.log(x)
}
Run Code Online (Sandbox Code Playgroud)

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

  1. 它们具有延迟(它们也需要时间来执行),这会使测量偏差.
  2. 它们具有非常有限的精度,这意味着您可以在Linux中将事件从26ns到26ns,在Windows中已经描述 300左右
  3. 不考虑预热阶段,使您的测量值波动很大.

Java中的currentMillis()nanoTime()方法可能很有用,但必须与EXTREME小心一起使用,否则您可能会出现错误的测量错误,例如测量片段的顺序会影响测量,或者像这样,作者错误地断定数百万次操作在实际上,JMV实现了没有进行任何操作并提升代码,根本不运行任何代码.

这是一个精彩的视频,解释了如何以正确的方式进行微基准测试:https://shipilev.net/#benchmarking

  • 这应该是现代基准测试的公认答案。 (3认同)

Mar*_*son 5

对于快速和肮脏的时间测量测试,不要使用挂钟时间 ( System.currentTimeMillis())。更喜欢System.nanoTime()

public static void main(String... ignored) throws InterruptedException {
    final long then = System.nanoTime();
    TimeUnit.SECONDS.sleep(1);
    final long millis = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - then);
    System.out.println("Slept for (ms): " + millis); // = something around 1000.
}
Run Code Online (Sandbox Code Playgroud)