如何计算在Java中执行一个方法所花费的时间?
当前回答
您可以在前后拍摄时间戳快照,然后重复实验几次以求平均结果。也有一些剖析器可以帮你做到这一点。
摘自《Java平台性能:策略和战术》一书:
currenttimemillis ()
class TimeTest1 {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
long total = 0;
for (int i = 0; i < 10000000; i++) {
total += i;
}
long stopTime = System.currentTimeMillis();
long elapsedTime = stopTime - startTime;
System.out.println(elapsedTime);
}
}
用一个StopWatch类
您可以使用这个StopWatch类,并在该方法之前和之后调用start()和stop。
class TimeTest2 {
public static void main(String[] args) {
Stopwatch timer = new Stopwatch().start();
long total = 0;
for (int i = 0; i < 10000000; i++) {
total += i;
}
timer.stop();
System.out.println(timer.getElapsedTime());
}
}
请看这里(存档)。
NetBeans分析器:
应用性能应用 性能概要:方法级CPU 性能(执行时间)。你可以 选择配置整个 应用程序的一部分 应用程序。
在这里看到的。
其他回答
如果您正在编写应用程序,那么答案是使用系统。currentTimeMillis或System。nanoTime的用途如上所述。
但是如果你已经写好了代码,并且你不想修改它,那么最好使用Spring的方法拦截器。例如,你的服务是:
public class MyService {
public void doSomething() {
for (int i = 1; i < 10000; i++) {
System.out.println("i=" + i);
}
}
}
为了避免更改服务,你可以编写自己的方法拦截器:
public class ServiceMethodInterceptor implements MethodInterceptor {
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
long startTime = System.currentTimeMillis();
Object result = methodInvocation.proceed();
long duration = System.currentTimeMillis() - startTime;
Method method = methodInvocation.getMethod();
String methodName = method.getDeclaringClass().getName() + "." + method.getName();
System.out.println("Method '" + methodName + "' took " + duration + " milliseconds to run");
return null;
}
}
还有一些开源api可用于Java,例如BTrace。 或者上面@bakkal和@Saikikos建议的Netbeans profiler。 谢谢。
您可以在前后拍摄时间戳快照,然后重复实验几次以求平均结果。也有一些剖析器可以帮你做到这一点。
摘自《Java平台性能:策略和战术》一书:
currenttimemillis ()
class TimeTest1 {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
long total = 0;
for (int i = 0; i < 10000000; i++) {
total += i;
}
long stopTime = System.currentTimeMillis();
long elapsedTime = stopTime - startTime;
System.out.println(elapsedTime);
}
}
用一个StopWatch类
您可以使用这个StopWatch类,并在该方法之前和之后调用start()和stop。
class TimeTest2 {
public static void main(String[] args) {
Stopwatch timer = new Stopwatch().start();
long total = 0;
for (int i = 0; i < 10000000; i++) {
total += i;
}
timer.stop();
System.out.println(timer.getElapsedTime());
}
}
请看这里(存档)。
NetBeans分析器:
应用性能应用 性能概要:方法级CPU 性能(执行时间)。你可以 选择配置整个 应用程序的一部分 应用程序。
在这里看到的。
更准确地说,我将使用nanoTime()方法而不是currentTimeMillis():
long startTime = System.nanoTime();
myCall();
long stopTime = System.nanoTime();
System.out.println(stopTime - startTime);
在Java 8中(输出格式为ISO-8601):
Instant start = Instant.now();
Thread.sleep(63553);
Instant end = Instant.now();
System.out.println(Duration.between(start, end)); // prints PT1M3.553S
番石榴秒表:
Stopwatch stopwatch = Stopwatch.createStarted();
myCall();
stopwatch.stop(); // optional
System.out.println("Time elapsed: "+ stopwatch.elapsed(TimeUnit.MILLISECONDS));
您可能需要考虑面向方面的编程。你不希望你的代码中充斥着时间。您希望能够以声明的方式关闭和打开它们。
如果你使用Spring,看看他们的MethodInterceptor类。
检查这个:System.currentTimeMillis。
你可以这样计算你的方法的时间:
long start = System.currentTimeMillis();
class.method();
long time = System.currentTimeMillis() - start;
推荐文章
- 在流中使用Java 8 foreach循环移动到下一项
- 访问限制:'Application'类型不是API(必需库rt.jar的限制)
- 用Java计算两个日期之间的天数
- 如何配置slf4j-simple
- 在Jar文件中运行类
- 带参数的可运行?
- 我如何得到一个字符串的前n个字符而不检查大小或出界?
- 我可以在Java中设置enum起始值吗?
- Java中的回调函数
- c#和Java中的泛型有什么不同?和模板在c++ ?
- 在Java中,流相对于循环的优势是什么?
- Jersey在未找到InjectionManagerFactory时停止工作
- 在Java流是peek真的只是调试?
- Recyclerview不调用onCreateViewHolder
- 将JSON字符串转换为HashMap