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

时间:2010-03-31 13:37:58

标签: java optimization

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

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

非常感谢

10 个答案:

答案 0 :(得分:41)

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

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

答案 1 :(得分:20)

如果瓶颈足够大,可以使用分析器观察,请使用分析器。

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

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

private double x = Math.PI;

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

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

  1. 他们有延迟(他们也需要时间来执行),这会使测量结果偏差。
  2. 他们的 非常 精度有限,这意味着您可以在Linux中将事件从26ns提升到26ns,在Windows中有300左右的事情描述here
  3. 不考虑预热阶段,使您的测量值波动很多。
  4. Java中的currentMillis()nanoTime()方法非常有用,但必须与极端小心一起使用,否则您可能会出现错误的测量错误like this所测量的片段影响测量或like this作者错误地断定数百万次操作在不到一秒的时间内完成,而事实上JMV实现了没有进行任何操作并提升代码,在所有

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

答案 2 :(得分:3)

你应该使用像

这样的探查器

它们可以轻松地与任何IDE集成,并显示您需要的任何细节。

当然这些工具很复杂并且用于描述复杂程序,如果您只需要一些简单的基准测试我建议您使用System.currentTimeMillis()System.nanoTime()并计算调用之间的毫秒数自己。

答案 3 :(得分:3)

使用分析器更好,因为您可以找到应用中的平均执行时间和瓶颈。

我使用VisualVM。光滑而简单。

答案 4 :(得分:3)

Google Guava has a stopwatch,简单易行。

Stopwatch stopwatch = Stopwatch.createStarted();
myFunctionCall();
LOGGER.debug("Time taken by myFunctionCall: " + stopwatch.stop());

答案 5 :(得分:3)

对于快速和肮脏的时间测量测试,请勿使用挂钟时间(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.
}

答案 6 :(得分:1)

Jprofiler和yourkit很好,但要花钱。

eclispe有一个名为TPTP(测试和性能工具平台)的免费插件可以为您提供代码执行时间。这是一个快速谷歌搜索提出的教程。 http://www.eclipse.org/articles/Article-TPTP-Profiling-Tool/tptpProfilingArticle.html

答案 7 :(得分:0)

您可以添加此代码,它会告诉您该方法执行的时间。

long millisecondsStart = System.currentTimeMillis();
executeMethod();
long timeSpentInMilliseconds = System.currentTimeMillis() - millisecondsStart;

答案 8 :(得分:0)

另一个自定义解决方案可以基于以下帖子:http://www.mkyong.com/spring/spring-aop-examples-advice/

然后,您还可以使用围绕应用程序监控的实用程序。 SNMP。如果您需要在生产环境中定期“定时”您的方法,您可能应该考虑使用其中一个SNMP工具

答案 9 :(得分:0)

通常我将时间存储在 .txt 文件中以分析结果

StopWatch sWatch = new StopWatch();
sWatch.start();

//do stuff that you want to measure
downloadContent();

sWatch.stop();

//make the time pretty
long timeInMilliseconds = sWatch.getTime();
long hours = TimeUnit.MILLISECONDS.toHours(timeInMilliseconds);
long minutes = TimeUnit.MILLISECONDS.toMinutes(timeInMilliseconds - TimeUnit.HOURS.toMillis(hours));
long seconds = TimeUnit.MILLISECONDS.toSeconds(timeInMilliseconds - TimeUnit.HOURS.toMillis(hours) - TimeUnit.MINUTES.toMillis(minutes));
long milliseconds = timeInMilliseconds - TimeUnit.HOURS.toMillis(hours) - TimeUnit.MINUTES.toMillis(minutes) - TimeUnit.SECONDS.toMillis(seconds);

String t = String.format("%02d:%02d:%02d:%d", hours, minutes, seconds, milliseconds);

//each line to store in a txt file, new line
String content = "Ref: " + ref + "  -  " + t + "\r\n";

//you may want wrap this section with a try catch
File file = new File("C:\\time_log.txt");
FileWriter fw = new FileWriter(file.getAbsoluteFile(), true); //append content set to true, so it does not overwrite existing data
BufferedWriter bw = new BufferedWriter(fw);
bw.write(content);
bw.close();