我有一个我自己用java编写的程序,但我想测试方法的执行时间,并获得特定方法的时间。我想知道这是否可能,通过某种方式的eclipse插件?或者可能会插入一些代码?
我明白了,这是一个相当小的程序,最多不超过1500行,最好是专用工具或System.currentTimeMillis()
发布于 2010-03-31 21:43:23
除了使用分析器之外,以下是获取所需内容的简单方法:
public class SomeClass{
public void somePublicMethod()
{
long startTime = System.currentTimeMillis();
someMethodWhichYouWantToProfile();
long endTime = System.currentTimeMillis();
System.out.println("Total execution time: " + (endTime-startTime) + "ms");
}
}发布于 2015-12-03 23:15:45
如果瓶颈大到足以用分析器观察到,那么就使用分析器。
如果您需要更高的准确性,测量一小段代码的最好方法是使用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()进行测量有许多限制:
它们有延迟(它们也需要时间来执行),这使得你的measurements.
Java中的currentMillis()和nanoTime()方法可以很有用,但必须与EXTREME CAUTION一起使用,否则您可能会得到错误的测量误差like this,其中测量代码的顺序会影响测量结果;或者like this,其中作者错误地得出结论,数百万次操作在不到一毫秒的时间内执行,而实际上JMV没有实现任何操作,并挂起了代码,根本不运行代码。
这里有一个精彩的视频,解释了如何以正确的方式进行微基准测试:https://shipilev.net/#benchmarking
发布于 2015-12-03 23:32:50
对于快速和肮脏的时间测量测试,不要使用挂钟时间(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.
}https://stackoverflow.com/questions/2553347
复制相似问题