问题
Is there a command in java to measure the execution time ?
Something like
System.out.println(execution.time);
in the end of the code.
回答1:
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");
}
}
回答2:
You can easily implement that yourself using 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(). Note that contrary to how currentTimeMillis()
works, the value returned by nanoTime()
is not relative to some specified time. This means that nanoTime()
can only be used to measure time spans and can't be used to identify some specifiy point in time.
回答3:
You could run a profiler, or use the difference of two calls to System.currentTimeMillis()
Like this :
long start = System.currentTimeMillis();
....
doSomething();
....
long end = System.currentTimeMillis();
System.out.println("Execution time was "+(end-start)+" ms.");
回答4:
Easiest way is to use System.currentTimeMillis() before and after the code executing. Joda-Time has more sophisticated versions of that: http://joda-time.sourceforge.net/
回答5:
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
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
回答6:
Use the ThreadMXBean for more detailed timing:
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);
}
}
回答7:
Apache Commons library has StopWatch class and Spring also has StopWatch.
回答8:
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.
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
回答9:
I liked the class example of 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";
}
}
来源:https://stackoverflow.com/questions/5471700/is-there-a-command-in-java-to-measure-the-execution-time