我有一个程序,我自己用java编写,但我想测试方法执行时间并获得特定方法的时间。我想知道这是否可能,或许某种程度上是一个eclipse插件?或者可能会插入一些代码?
我知道,这是一个相当小的程序,不超过1500行,这是一个更好的专用工具还是System.currentTimeMillis()
?
非常感谢
答案 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 JMH或Google's Caliper。我相信它们和JUnit一样简单,不仅可以获得更准确的结果,而且您将从社区获得专业知识。
遵循JMH微基准测试来衡量Math.log()
的执行时间:
private double x = Math.PI;
@Benchmark
public void myBenchmark() {
return Math.log(x)
}
使用currentMillis()
和nanoTime()
进行衡量有许多限制:
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();