[英]Is there a command in java to measure the execution time?
Is there a command in java to measure the execution time ? java中是否有命令来测量执行时间?
Something like 就像是
System.out.println(execution.time);
in the end of the code. 在代码的最后。
Here is a complete and little modified example on how you could do that: 这是一个完整的,很少修改的例子 ,说明如何做到这一点:
public class ExecutionTimer {
private long start;
private long end;
public ExecutionTimer() {
reset();
start = System.currentTimeMillis();
}
public void end() {
end = System.currentTimeMillis();
}
public long duration(){
return (end-start);
}
public void reset() {
start = 0;
end = 0;
}
public static void main(String s[]) {
// simple example
ExecutionTimer t = new ExecutionTimer();
for (int i = 0; i < 80; i++){
System.out.print(".");
}
t.end();
System.out.println("\n" + t.duration() + " ms");
}
}
You can easily implement that yourself using System.currentTimeMillis()
: 您可以使用
System.currentTimeMillis()
轻松实现它:
final long start = System.currentTimeMillis();
executeLongRunningTask();
final long durationInMilliseconds = System.currentTimeMillis()-start;
System.out.println("executeLongRunningTask() took " + durationInMilliseconds + "ms.");
Alternatively (especially if your task doesn't run as long), you might want to use System.nanoTime()
. 或者(特别是如果您的任务运行时间不长),您可能希望使用
System.nanoTime()
。 Note that contrary to how currentTimeMillis()
works, the value returned by nanoTime()
is not relative to some specified time. 请注意,与
currentTimeMillis()
工作方式相反, nanoTime()
返回的值与某个指定时间无关 。 This means that nanoTime()
can only be used to measure time spans and can't be used to identify some specifiy point in time. 这意味着
nanoTime()
只能用于测量时间跨度 ,不能用于识别某些特定时间点。
You could run a profiler, or use the difference of two calls to System.currentTimeMillis()
您可以运行分析器,或使用两次调用
System.currentTimeMillis()
的差异
Like this : 像这样 :
long start = System.currentTimeMillis();
....
doSomething();
....
long end = System.currentTimeMillis();
System.out.println("Execution time was "+(end-start)+" ms.");
Easiest way is to use System.currentTimeMillis() before and after the code executing. 最简单的方法是在代码执行之前和之后使用System.currentTimeMillis()。 Joda-Time has more sophisticated versions of that: http://joda-time.sourceforge.net/
Joda-Time有更复杂的版本: http : //joda-time.sourceforge.net/
If you want to have more details on what you measure, I strongly suggest you use JMX especially ThreadMXBean : http://download.oracle.com/javase/6/docs/api/java/lang/management/ThreadMXBean.html 如果你想了解你测量的更多细节,我强烈建议你使用JMX特别是ThreadMXBean: http : //download.oracle.com/javase/6/docs/api/java/lang/management/ThreadMXBean.html
Code sample : 代码示例:
ThreadMXBean bean = ManagementFactory.getThreadMXBean( );
if (bean.isCurrentThreadCpuTimeSupported()) {
long cpuTime = bean.getCurrentThreadCpuTime( );
}
long userTime = bean.getCurrentThreadUserTime( );
A quite complete explanation with code samples is available here : http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking 有关代码示例的完整说明,请访问: http : //nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking
Use the ThreadMXBean for more detailed timing: 使用ThreadMXBean进行更详细的计时:
public class Timer {
static {
// needed to request 1ms timer interrupt period
// http://discuss.joelonsoftware.com/default.asp?joel.3.642646.9
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(Integer.MAX_VALUE); (Windows NT)
} catch (InterruptedException ignored) {
}
}
});
thread.setName("Timer");
thread.setDaemon(true);
thread.start();
}
private final ThreadMXBean threadMX = ManagementFactory.getThreadMXBean();
private final long elapsedStart;
private final long cpuStart;
private final long userStart;
public Timer() {
cpuStart = threadMX.getCurrentThreadCpuTime();
userStart = threadMX.getCurrentThreadUserTime();
elapsedStart = System.nanoTime();
}
public void times() {
long elapsed = elapsedStart - System.nanoTime();
long cpu = cpuStart - threadMX.getCurrentThreadCpuTime();
long user = userStart - threadMX.getCurrentThreadUserTime();
System.out.printf("elapsed=%-8.3f cpu=%-8.3f user=%-8.3f [seconds]",
elapsed/1.0e9, cpu/1.0e9, user/1.0e9);
}
}
I liked the class example of RoflcoptrException. 我喜欢RoflcoptrException的类示例。 I rewrote it to its essentials:
我重写了它的基本要点:
public class ExecutionTimer {
private long start;
public ExecutionTimer() {
restart();
}
public void restart() {
start = System.currentTimeMillis();
}
public long time(){
long end = System.currentTimeMillis();
return (end-start);
}
public String toString() {
return "Time="+time()+" ms";
}
}
You can design a control abstraction time
that takes as parameter an action to be performed and measures and prints the time required to execute it. 您可以设计一个控件抽象
time
,该控件抽象time
将参数作为要执行的操作,并测量并打印执行它所需的时间。
Code: 码:
interface Action<A> {
public A perform();
}
class Timer {
public static <A> A time(final String description, final Action<A> action) {
final long start = System.nanoTime();
final A result = action.perform();
final long end = System.nanoTime();
System.out.println(description + " - Time elapsed: " + (end - start) +"ns");
return result;
}
}
class Main {
public static void main(final String[] args) {
final int factorialOf5 = Timer.time("Calculating factorial of 5",
new Action<Integer>() {
public Integer perform() {
int result = 1;
for(int i = 2; i <= 5; i++) {
result *= i;
}
return result;
}
}
);
System.out.println("Result: " + factorialOf5);
}
}
// Output:
// Calculating factorial of 5 - Time elapsed: 782052ns
// Result: 120
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.