How do I time a method's execution in Java?

JavaTimingExecution Time

Java Problem Overview


  1. How do I get a method's execution time?
  2. Is there a Timer utility class for things like timing how long a task takes, etc?

Most of the searches on Google return results for timers that schedule threads and tasks, which is not what I want.

Java Solutions


Solution 1 - Java

There is always the old-fashioned way:

long startTime = System.nanoTime();
methodToTime();
long endTime = System.nanoTime();

long duration = (endTime - startTime);  //divide by 1000000 to get milliseconds.

Solution 2 - Java

I go with the simple answer. Works for me.

long startTime = System.currentTimeMillis();

doReallyLongThing();

long endTime = System.currentTimeMillis();

System.out.println("That took " + (endTime - startTime) + " milliseconds");

It works quite well. The resolution is obviously only to the millisecond, you can do better with System.nanoTime(). There are some limitations to both (operating system schedule slices, etc.) but this works pretty well.

Average across a couple of runs (the more the better) and you'll get a decent idea.

Solution 3 - Java

Come on guys! Nobody mentioned the Guava way to do that (which is arguably awesome):

import com.google.common.base.Stopwatch;

Stopwatch timer = Stopwatch.createStarted();
//method invocation
LOG.info("Method took: " + timer.stop());

The nice thing is that Stopwatch.toString() does a good job of selecting time units for the measurement. I.e. if the value is small, it'll output 38 ns, if it's long, it'll show 5m 3s

Even nicer:

Stopwatch timer = Stopwatch.createUnstarted();
for (...) {
   timer.start();
   methodToTrackTimeFor();
   timer.stop();
   methodNotToTrackTimeFor();
}
LOG.info("Method took: " + timer);

Note: Google Guava requires Java 1.6+

Solution 4 - Java

Using Instant and Duration from Java 8's new API,

Instant start = Instant.now();
Thread.sleep(5000);
Instant end = Instant.now();
System.out.println(Duration.between(start, end));

outputs,

PT5S

Solution 5 - Java

Gathered all possible ways together into one place.

Date

Date startDate = Calendar.getInstance().getTime();
long d_StartTime = new Date().getTime();
Thread.sleep(1000 * 4);
Date endDate = Calendar.getInstance().getTime();
long d_endTime = new Date().getTime();
System.out.format("StartDate : %s, EndDate : %s \n", startDate, endDate);
System.out.format("Milli = %s, ( D_Start : %s, D_End : %s ) \n", (d_endTime - d_StartTime),d_StartTime, d_endTime);

System.currentTimeMillis()

long startTime = System.currentTimeMillis();
Thread.sleep(1000 * 4);
long endTime = System.currentTimeMillis();
long duration = (endTime - startTime);  
System.out.format("Milli = %s, ( S_Start : %s, S_End : %s ) \n", duration, startTime, endTime );
System.out.println("Human-Readable format : "+millisToShortDHMS( duration ) );

Human Readable Format

public static String millisToShortDHMS(long duration) {
    String res = "";	// java.util.concurrent.TimeUnit;
    long days		= TimeUnit.MILLISECONDS.toDays(duration);
    long hours		= TimeUnit.MILLISECONDS.toHours(duration) -
    				  TimeUnit.DAYS.toHours(TimeUnit.MILLISECONDS.toDays(duration));
    long minutes	= TimeUnit.MILLISECONDS.toMinutes(duration) -
    				  TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(duration));
    long seconds 	= TimeUnit.MILLISECONDS.toSeconds(duration) -
    				  TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(duration));
    long millis 	= TimeUnit.MILLISECONDS.toMillis(duration) - 
    				  TimeUnit.SECONDS.toMillis(TimeUnit.MILLISECONDS.toSeconds(duration));
   
    if (days == 0)		res = String.format("%02d:%02d:%02d.%04d", hours, minutes, seconds, millis);
    else				res = String.format("%dd %02d:%02d:%02d.%04d", days, hours, minutes, seconds, millis);
    return res;
}

Guava: Google StopwatchJAR « An object of Stopwatch is to measures elapsed time in nanoseconds.

com.google.common.base.Stopwatch g_SW = Stopwatch.createUnstarted();
g_SW.start();
Thread.sleep(1000 * 4);
g_SW.stop();
System.out.println("Google StopWatch  : "+g_SW);

Apache Commons LangJAR « StopWatch provides a convenient API for timings.

org.apache.commons.lang3.time.StopWatch sw = new StopWatch();
sw.start();		
Thread.sleep(1000 * 4);		
sw.stop();
System.out.println("Apache StopWatch  : "+ millisToShortDHMS(sw.getTime()) );

JODA-TIME

public static void jodaTime() throws InterruptedException, ParseException{
	java.text.SimpleDateFormat ms_SDF = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS");
	String start = ms_SDF.format( new Date() ); // java.util.Date
			
	Thread.sleep(10000);
	
	String end = ms_SDF.format( new Date() );		
	System.out.println("Start:"+start+"\t Stop:"+end);
	
	Date date_1 = ms_SDF.parse(start);
	Date date_2 = ms_SDF.parse(end);		
	Interval interval = new org.joda.time.Interval( date_1.getTime(), date_2.getTime() );
	Period period = interval.toPeriod(); //org.joda.time.Period
	  
	System.out.format("%dY/%dM/%dD, %02d:%02d:%02d.%04d \n", 
		period.getYears(), period.getMonths(), period.getDays(),
		period.getHours(), period.getMinutes(), period.getSeconds(), period.getMillis());
}

Java date time API from Java 8 « A Duration object represents a period of time between two Instant objects.

Instant start = java.time.Instant.now();
	Thread.sleep(1000);
Instant end = java.time.Instant.now();
Duration between = java.time.Duration.between(start, end);
System.out.println( between ); // PT1.001S
System.out.format("%dD, %02d:%02d:%02d.%04d \n", between.toDays(),
		between.toHours(), between.toMinutes(), between.getSeconds(), between.toMillis()); // 0D, 00:00:01.1001 

Spring Framework provides StopWatch utility class to measure elapsed time in Java.

StopWatch sw = new org.springframework.util.StopWatch();
sw.start("Method-1"); // Start a named task
	Thread.sleep(500);
sw.stop();

sw.start("Method-2");
	Thread.sleep(300);
sw.stop();

sw.start("Method-3");
	Thread.sleep(200);
sw.stop();

System.out.println("Total time in milliseconds for all tasks :\n"+sw.getTotalTimeMillis());
System.out.println("Table describing all tasks performed :\n"+sw.prettyPrint());

System.out.format("Time taken by the last task : [%s]:[%d]", 
		sw.getLastTaskName(),sw.getLastTaskTimeMillis());

System.out.println("\n Array of the data for tasks performed « Task Name: Time Taken");
TaskInfo[] listofTasks = sw.getTaskInfo();
for (TaskInfo task : listofTasks) {
	System.out.format("[%s]:[%d]\n", 
			task.getTaskName(), task.getTimeMillis());
}

OutPut:

Total time in milliseconds for all tasks :
999
Table describing all tasks performed :
StopWatch '': running time (millis) = 999
-----------------------------------------
ms     %     Task name
-----------------------------------------
00500  050%  Method-1
00299  030%  Method-2
00200  020%  Method-3

Time taken by the last task : [Method-3]:[200]
 Array of the data for tasks performed « Task Name: Time Taken
[Method-1]:[500]
[Method-2]:[299]
[Method-3]:[200]

Solution 6 - Java

Use a profiler (JProfiler, Netbeans Profiler, Visual VM, Eclipse Profiler, etc). You'll get the most accurate results and is the least intrusive. They use the built-in JVM mechanism for profiling which can also give you extra information like stack traces, execution paths, and more comprehensive results if necessary.

When using a fully integrated profiler, it's faily trivial to profile a method. Right click, Profiler -> Add to Root Methods. Then run the profiler just like you were doing a test run or debugger.

Solution 7 - Java

System.currentTimeMillis(); IS NOT a good approach for measuring the performance of your algorithms. It measures the total time you experience as a user watching the computer screen. It includes also time consumed by everything else running on your computer in the background. This could make a huge difference in case you have a lot of programs running on your workstation.

Proper approach is using java.lang.management package.

From http://nadeausoftware.com/articles/2008/03/java_tip_how_get_cpu_and_user_time_benchmarking website (archive link):

  • "User time" is the time spent running your application's own code.
  • "System time" is the time spent running OS code on behalf of your application (such as for I/O).

getCpuTime() method gives you sum of those:

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadMXBean;

public class CPUUtils {

	/** Get CPU time in nanoseconds. */
	public static long getCpuTime( ) {
	    ThreadMXBean bean = ManagementFactory.getThreadMXBean( );
	    return bean.isCurrentThreadCpuTimeSupported( ) ?
	        bean.getCurrentThreadCpuTime( ) : 0L;
	}
	
	/** Get user time in nanoseconds. */
	public static long getUserTime( ) {
	    ThreadMXBean bean = ManagementFactory.getThreadMXBean( );
	    return bean.isCurrentThreadCpuTimeSupported( ) ?
	        bean.getCurrentThreadUserTime( ) : 0L;
	}
	
	/** Get system time in nanoseconds. */
	public static long getSystemTime( ) {
	    ThreadMXBean bean = ManagementFactory.getThreadMXBean( );
	    return bean.isCurrentThreadCpuTimeSupported( ) ?
	        (bean.getCurrentThreadCpuTime( ) - bean.getCurrentThreadUserTime( )) : 0L;
	}

}

Solution 8 - Java

This probably isn't what you wanted me to say, but this is a good use of AOP. Whip an proxy interceptor around your method, and do the timing in there.

The what, why and how of AOP is rather beyond the scope of this answer, sadly, but that's how I'd likely do it.

Edit: Here's a link to Spring AOP to get you started, if you're keen. This is the most accessible implementation of AOP that Iive come across for java.

Also, given everyone else's very simple suggestions, I should add that AOP is for when you don't want stuff like timing to invade your code. But in many cases, that sort of simple and easy approach is fine.

Solution 9 - Java

With Java 8 you can do also something like this with every normal methods:

Object returnValue = TimeIt.printTime(() -> methodeWithReturnValue());
//do stuff with your returnValue

with TimeIt like:

public class TimeIt {

public static <T> T printTime(Callable<T> task) {
	T call = null;
	try {
        long startTime = System.currentTimeMillis();
		call = task.call();
		System.out.print((System.currentTimeMillis() - startTime) / 1000d + "s");
	} catch (Exception e) {
		//...
	}
    return call;
}
}

With this methode you can make easy time measurement anywhere in your code without breaking it. In this simple example i just print the time. May you add a Switch for TimeIt, e.g. to only print the time in DebugMode or something.

If you are working with Function you can do somthing like this:

Function<Integer, Integer> yourFunction= (n) -> {
		return IntStream.range(0, n).reduce(0, (a, b) -> a + b);
	};

Integer returnValue = TimeIt.printTime2(yourFunction).apply(10000);
//do stuff with your returnValue

public static <T, R> Function<T, R> printTime2(Function<T, R> task) {
	return (t) -> {
		long startTime = System.currentTimeMillis();
		R apply = task.apply(t);
		System.out.print((System.currentTimeMillis() - startTime) / 1000d
				+ "s");
		return apply;
	};
}

Solution 10 - Java

Also We can use StopWatch class of Apache commons for measuring the time.

Sample code

org.apache.commons.lang.time.StopWatch sw = new org.apache.commons.lang.time.StopWatch();

System.out.println("getEventFilterTreeData :: Start Time : " + sw.getTime());
sw.start();

// Method execution code

sw.stop();
System.out.println("getEventFilterTreeData :: End Time : " + sw.getTime());

Solution 11 - Java

JEP 230: Microbenchmark Suite

FYI, JEP 230: Microbenchmark Suite is an OpenJDK project to:

>Add a basic suite of microbenchmarks to the JDK source code, and make it easy for developers to run existing microbenchmarks and create new ones.

This feature arrived in Java 12.

Java Microbenchmark Harness (JMH)

For earlier versions of Java, take a look at the Java Microbenchmark Harness (JMH) project on which JEP 230 is based.

Solution 12 - Java

Just a small twist, if you don't use tooling and want to time methods with low execution time: execute it many times, each time doubling the number of times it is executed until you reach a second, or so. Thus, the time of the Call to System.nanoTime and so forth, nor the accuracy of System.nanoTime does affect the result much.

    int runs = 0, runsPerRound = 10;
    long begin = System.nanoTime(), end;
    do {
        for (int i=0; i<runsPerRound; ++i) timedMethod();
        end = System.nanoTime();
        runs += runsPerRound;
        runsPerRound *= 2;
    } while (runs < Integer.MAX_VALUE / 2 && 1000000000L > end - begin);
    System.out.println("Time for timedMethod() is " + 
        0.000000001 * (end-begin) / runs + " seconds");

Of course, the caveats about using the wall clock apply: influences of JIT-compilation, multiple threads / processes etc. Thus, you need to first execute the method a lot of times first, such that the JIT compiler does its work, and then repeat this test multiple times and take the lowest execution time.

Solution 13 - Java

We are using AspectJ and Java annotations for this purpose. If we need to know to execution time for a method, we simple annotate it. A more advanced version could use an own log level that can enabled and disabled at runtime.

public @interface Trace {
  boolean showParameters();
}

@Aspect
public class TraceAspect {
  [...]
  @Around("tracePointcut() && @annotation(trace) && !within(TraceAspect)")
  public Object traceAdvice ( ProceedingJintPoint jP, Trace trace ) {

    Object result;
    // initilize timer

    try { 
      result = jp.procced();
    } finally { 
      // calculate execution time 
    }

    return result;
  }
  [...]
}

Solution 14 - Java

Really good code.

http://www.rgagnon.com/javadetails/java-0585.html

import java.util.concurrent.TimeUnit;

long startTime = System.currentTimeMillis();
........
........
........
long finishTime = System.currentTimeMillis();

String diff = millisToShortDHMS(finishTime - startTime);


  /**
   * converts time (in milliseconds) to human-readable format
   *  "<dd:>hh:mm:ss"
   */
  public static String millisToShortDHMS(long duration) {
    String res = "";
    long days  = TimeUnit.MILLISECONDS.toDays(duration);
    long hours = TimeUnit.MILLISECONDS.toHours(duration)
                   - TimeUnit.DAYS.toHours(TimeUnit.MILLISECONDS.toDays(duration));
    long minutes = TimeUnit.MILLISECONDS.toMinutes(duration)
                     - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(duration));
    long seconds = TimeUnit.MILLISECONDS.toSeconds(duration)
                   - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(duration));
    if (days == 0) {
      res = String.format("%02d:%02d:%02d", hours, minutes, seconds);
    }
    else {
      res = String.format("%dd%02d:%02d:%02d", days, hours, minutes, seconds);
    }
    return res;
  }

Solution 15 - Java

Spring provides a utility class org.springframework.util.StopWatch, as per JavaDoc:

> Simple stop watch, allowing for timing of a number of tasks, exposing > total running time and running time for each named task.

Usage:

StopWatch stopWatch = new StopWatch("Performance Test Result");

stopWatch.start("Method 1");
doSomething1();//method to test
stopWatch.stop();

stopWatch.start("Method 2");
doSomething2();//method to test
stopWatch.stop();

System.out.println(stopWatch.prettyPrint());

Output:

StopWatch 'Performance Test Result': running time (millis) = 12829
-----------------------------------------
ms     %     Task name
-----------------------------------------
11907  036%  Method 1
00922  064%  Method 2

With Aspects:

@Around("execution(* my.package..*.*(..))")
public Object logTime(ProceedingJoinPoint joinPoint) throws Throwable {
	StopWatch stopWatch = new StopWatch();
	stopWatch.start();
	Object retVal = joinPoint.proceed();
	stopWatch.stop();
	log.info(" execution time: " + stopWatch.getTotalTimeMillis() + " ms");
	return retVal;
}

Solution 16 - Java

You can use Perf4j. Very cool utility. Usage is simple

String watchTag = "target.SomeMethod";
StopWatch stopWatch = new LoggingStopWatch(watchTag);
Result result = null; // Result is a type of a return value of a method
try {
    result = target.SomeMethod();
    stopWatch.stop(watchTag + ".success");
} catch (Exception e) {
    stopWatch.stop(watchTag + ".fail", "Exception was " + e);
    throw e; 
}

More information can be found in Developer Guide

Edit: Project seems dead

Solution 17 - Java

I have written a method to print the method execution time in a much readable form. For example, to calculate the factorial of 1 Million, it takes approximately 9 minutes. So the execution time get printed as:

Execution Time: 9 Minutes, 36 Seconds, 237 MicroSeconds, 806193 NanoSeconds

The code is here:

public class series
{
	public static void main(String[] args)
	{
		long startTime = System.nanoTime();

		long n = 10_00_000;
		printFactorial(n);

		long endTime = System.nanoTime();
		printExecutionTime(startTime, endTime);

	}

	public static void printExecutionTime(long startTime, long endTime)
	{
		long time_ns = endTime - startTime;
		long time_ms = TimeUnit.NANOSECONDS.toMillis(time_ns);
		long time_sec = TimeUnit.NANOSECONDS.toSeconds(time_ns);
		long time_min = TimeUnit.NANOSECONDS.toMinutes(time_ns);
		long time_hour = TimeUnit.NANOSECONDS.toHours(time_ns);

		System.out.print("\nExecution Time: ");
		if(time_hour > 0)
		    System.out.print(time_hour + " Hours, ");
		if(time_min > 0)
		    System.out.print(time_min % 60 + " Minutes, ");
		if(time_sec > 0)
		    System.out.print(time_sec % 60 + " Seconds, ");
		if(time_ms > 0)
		    System.out.print(time_ms % 1E+3 + " MicroSeconds, ");
		if(time_ns > 0)
		    System.out.print(time_ns % 1E+6 + " NanoSeconds");
	}
}

Solution 18 - Java

Using AOP/AspectJ and @Loggable annotation from jcabi-aspects you can do it easy and compact:

@Loggable(Loggable.DEBUG)
public String getSomeResult() {
  // return some value
}

Every call to this method will be sent to SLF4J logging facility with DEBUG logging level. And every log message will include execution time.

Solution 19 - Java

new Timer(""){{
    // code to time	
}}.timeMe();



public class Timer {

	private final String timerName;
	private long started;

	public Timer(String timerName) {
		this.timerName = timerName;
		this.started = System.currentTimeMillis();
	}
	
	public void timeMe() {
		System.out.println(
		String.format("Execution of '%s' takes %dms.", 
                timerName, 
                started-System.currentTimeMillis()));
	}

}

Solution 20 - Java

I basically do variations of this, but considering how hotspot compilation works, if you want to get accurate results you need to throw out the first few measurements and make sure you are using the method in a real world (read application specific) application.

If the JIT decides to compile it your numbers will vary heavily. so just be aware

Solution 21 - Java

There are a couple of ways to do that. I normally fall back to just using something like this:

long start = System.currentTimeMillis();
// ... do something ...
long end = System.currentTimeMillis();

or the same thing with System.nanoTime();

For something more on the benchmarking side of things there seems also to be this one: <http://jetm.void.fm/> Never tried it though.

Solution 22 - Java

You can use Metrics library which provides various measuring instruments. Add dependency:

<dependencies>
    <dependency>
        <groupId>io.dropwizard.metrics</groupId>
        <artifactId>metrics-core</artifactId>
        <version>${metrics.version}</version>
    </dependency>
</dependencies>

And configure it for your environment.

Methods can be annotated with @Timed:

@Timed
public void exampleMethod(){
    // some code
}

or piece of code wrapped with Timer:

final Timer timer = metricsRegistry.timer("some_name");
final Timer.Context context = timer.time();
// timed code
context.stop();

Aggregated metrics can exported to console, JMX, CSV or other.

@Timed metrics output example:

com.example.ExampleService.exampleMethod
             count = 2
         mean rate = 3.11 calls/minute
     1-minute rate = 0.96 calls/minute
     5-minute rate = 0.20 calls/minute
    15-minute rate = 0.07 calls/minute
               min = 17.01 milliseconds
               max = 1006.68 milliseconds
              mean = 511.84 milliseconds
            stddev = 699.80 milliseconds
            median = 511.84 milliseconds
              75% <= 1006.68 milliseconds
              95% <= 1006.68 milliseconds
              98% <= 1006.68 milliseconds
              99% <= 1006.68 milliseconds
            99.9% <= 1006.68 milliseconds

Solution 23 - Java

In Spring framework we have a call called StopWatch (org.springframework.util.StopWatch)

//measuring elapsed time using Spring StopWatch
        StopWatch watch = new StopWatch();
        watch.start();
        for(int i=0; i< 1000; i++){
            Object obj = new Object();
        }
        watch.stop();
        System.out.println("Total execution time to create 1000 objects in Java using StopWatch in millis: "
                + watch.getTotalTimeMillis());

Solution 24 - Java

If you want wall-clock time

long start_time = System.currentTimeMillis();
object.method();
long end_time = System.currentTimeMillis();
long execution_time = end_time - start_time;

Solution 25 - Java

long startTime = System.currentTimeMillis();
// code goes here
long finishTime = System.currentTimeMillis();
long elapsedTime = finishTime - startTime; // elapsed time in milliseconds

Solution 26 - Java

As "skaffman" said, use AOP OR you can use run time bytecode weaving, just like unit test method coverage tools use to transparently add timing info to methods invoked.

You can look at code used by open source tools tools like Emma (http://downloads.sourceforge.net/emma/emma-2.0.5312-src.zip?modtime=1118607545&big_mirror=0). The other opensource coverage tool is http://prdownloads.sourceforge.net/cobertura/cobertura-1.9-src.zip?download.

If you eventually manage to do what you set out for, pls. share it back with the community here with your ant task/jars.

Solution 27 - Java

I modified the code from correct answer to get result in seconds:

long startTime = System.nanoTime();

methodCode ...

long endTime = System.nanoTime();
double duration = (double)(endTime - startTime) / (Math.pow(10, 9));
Log.v(TAG, "MethodName time (s) = " + duration);

Solution 28 - Java

Performance measurements on my machine

  • System.nanoTime() : 750ns
  • System.currentTimeMillis() : 18ns

As mentioned, System.nanoTime() is thought to measure elapsed time. Just be aware of the cost if used inside a loop or the like.

Solution 29 - Java

Ok, this is a simple class to be used for simple simple timing of your functions. There is an example below it.

public class Stopwatch {
    static long startTime;
    static long splitTime;
    static long endTime;

    public Stopwatch() {
        start();
    }

    public void start() {
        startTime = System.currentTimeMillis();
        splitTime = System.currentTimeMillis();
        endTime = System.currentTimeMillis();
    }

    public void split() {
        split("");
    }

    public void split(String tag) {
        endTime = System.currentTimeMillis();
        System.out.println("Split time for [" + tag + "]: " + (endTime - splitTime) + " ms");
        splitTime = endTime;
    }

    public void end() {
        end("");
    }
    public void end(String tag) {
        endTime = System.currentTimeMillis();
        System.out.println("Final time for [" + tag + "]: " + (endTime - startTime) + " ms");
    }
}

Sample of use:

public static Schedule getSchedule(Activity activity_context) {
        String scheduleJson = null;
        Schedule schedule = null;
/*->*/  Stopwatch stopwatch = new Stopwatch();

        InputStream scheduleJsonInputStream = activity_context.getResources().openRawResource(R.raw.skating_times);
/*->*/  stopwatch.split("open raw resource");

        scheduleJson = FileToString.convertStreamToString(scheduleJsonInputStream);
/*->*/  stopwatch.split("file to string");

        schedule = new Gson().fromJson(scheduleJson, Schedule.class);
/*->*/  stopwatch.split("parse Json");
/*->*/  stopwatch.end("Method getSchedule"); 
    return schedule;
}

Sample of console output:

Split time for [file to string]: 672 ms
Split time for [parse Json]: 893 ms
Final time for [get Schedule]: 1565 ms

Solution 30 - Java

You can use stopwatch class from spring core project:

Code:

StopWatch stopWatch = new StopWatch()
stopWatch.start();  //start stopwatch
// write your function or line of code.
stopWatch.stop();  //stop stopwatch
stopWatch.getTotalTimeMillis() ; ///get total time

Documentation for Stopwatch: Simple stop watch, allowing for timing of a number of tasks, exposing total running time and running time for each named task. Conceals use of System.currentTimeMillis(), improving the readability of application code and reducing the likelihood of calculation errors. Note that this object is not designed to be thread-safe and does not use synchronization. This class is normally used to verify performance during proof-of-concepts and in development, rather than as part of production applications.

Solution 31 - Java

You can try this way if just want know the time.

long startTime = System.currentTimeMillis();
//@ Method call
System.out.println("Total time [ms]: " + (System.currentTimeMillis() - startTime));    

Solution 32 - Java

In Java 8 a new class named Instant is introduced. As per doc:

> Instant represents the start of a nanosecond on the time line. This > class is useful for generating a time stamp to represent machine time. > The range of an instant requires the storage of a number larger than a > long. To achieve this, the class stores a long representing > epoch-seconds and an int representing nanosecond-of-second, which will > always be between 0 and 999,999,999. The epoch-seconds are measured > from the standard Java epoch of 1970-01-01T00:00:00Z where instants > after the epoch have positive values, and earlier instants have > negative values. For both the epoch-second and nanosecond parts, a > larger value is always later on the time-line than a smaller value.

This can be used as:

Instant start = Instant.now();
try {
	Thread.sleep(7000);
} catch (InterruptedException e) {
	e.printStackTrace();
}
Instant end = Instant.now();
System.out.println(Duration.between(start, end));

It prints PT7.001S.

Solution 33 - Java

It would be nice if java had a better functional support, so that the action, that needs to be measured, could be wrapped into a block:

measure {
   // your operation here
}

In java this could be done by anonymous functions, that look too verbose

public interface Timer {
    void wrap();
}


public class Logger {

    public static void logTime(Timer timer) {
        long start = System.currentTimeMillis();
        timer.wrap();
        System.out.println("" + (System.currentTimeMillis() - start) + "ms");
    }

    public static void main(String a[]) {
        Logger.logTime(new Timer() {
            public void wrap() {
                // Your method here
                timeConsumingOperation();
            }
        });

    }

    public static void timeConsumingOperation() {
        for (int i = 0; i<=10000; i++) {
           System.out.println("i=" +i);
        }
    }
}

Solution 34 - Java

You can use javaagent to modify the java class bytes ,add the monitor codes dynamically.there is some open source tools on the github that can do this for you.
If you want to do it by yourself, just implements the javaagent,use javassist to modify the methods you want to monitor,and the monitor code before your method return.it's clean and you can monitor systems that you even don't have source code.

Solution 35 - Java

Here is pretty printed string ready formated seconds elapsed similar to google search time took to search:

		long startTime = System.nanoTime();
        //	... methodToTime();
        long endTime = System.nanoTime();
		long duration = (endTime - startTime);
		long seconds = (duration / 1000) % 60;
		// formatedSeconds = (0.xy seconds)
		String formatedSeconds = String.format("(0.%d seconds)", seconds);
		System.out.println("formatedSeconds = "+ formatedSeconds);
		// i.e actual formatedSeconds = (0.52 seconds)

Solution 36 - Java

I implemented a simple timer, And I think it's really useful:

public class Timer{
	private static long start_time;
	
	public static double tic(){
		return start_time = System.nanoTime();
	}
	
	public static double toc(){
		return (System.nanoTime()-start_time)/1000000000.0;
	}
	
}

That way you can time one or more actions:

Timer.tic();
// Code 1
System.out.println("Code 1 runtime: "+Timer.toc()+" seconds.");
// Code 2
System.out.println("(Code 1 + Code 2) runtime: "+Timer.toc()+"seconds");
Timer.tic();
// Code 3
System.out.println("Code 3 runtime: "+Timer.toc()+" seconds.");

Solution 37 - Java

System.nanoTime() is a pretty precise system utility to measure execution time. But be careful, if you're running on pre-emptive scheduler mode (default), this utility actually measures wall-clock time and not CPU time. Therefore, you may notice different execution time values from run to run, depending on system loads. If you look for CPU time, I think that running your program in real-time mode will do the trick. You have to use RT linux. link: https://stackoverflow.com/questions/10502508/real-time-programming-with-linux

Solution 38 - Java

A strategy that works to me in java ee was:

  1. Create a class with a method annotated with @AroundInvoke;

    @Singleton
    public class TimedInterceptor implements Serializable {
    
        @AroundInvoke
        public Object logMethod(InvocationContext ic) throws Exception {
    	    Date start = new Date();
            Object result = ic.proceed();
        	Date end = new Date();
        	System.out.println("time: " + (end.getTime - start.getTime()));
            return result;
        }
    }
    
  2. Annotate the method that you want to monitoring:

    @Interceptors(TimedInterceptor.class)
    public void onMessage(final Message message) { ... 
    

I hope this can help.

Solution 39 - Java

For java 8+, another possible solution (more general, func-style and without aspects) could be to create some utility method accepting code as a parameter

public static <T> T timed (String description, Consumer<String> out, Supplier<T> code) {
    final LocalDateTime start = LocalDateTime.now ();
    T res = code.get ();
    final long execTime = Duration.between (start, LocalDateTime.now ()).toMillis ();
    out.accept (String.format ("%s: %d ms", description, execTime));
    return res;
}

And the calling code could be smth like that:

public static void main (String[] args) throws InterruptedException {
    timed ("Simple example", System.out::println, Timing::myCode);
}

public static Object myCode () {
    try {
        Thread.sleep (1500);
    } catch (InterruptedException e) {
        e.printStackTrace ();
    }
    return null;
}

Solution 40 - Java

Also could be implemented Timer interface and executed on any method of your clas

import java.util.function.*;

public interface Timer {

    default void timeIt(Runnable r) {
        timeIt(() -> { r.run(); return 0;});
    }

    default <S,T> T timeIt(Function<S,T> fun, S arg) {
        long start = System.nanoTime();
        T result = fun.apply(arg);
        long stop = System.nanoTime();
        System.out.println("Time: " + (stop-start)/1000000.0 + " msec");
        return result;
    }

    default <T> T timeIt(Supplier<T> s) {
        return timeIt(obj -> s.get(), null);
    }
}

Usage:

class MyClass implements Timer ..

timeIt(this::myFunction); 

Solution 41 - Java

There's a lot of valid answers here, all of which are implemented within the method. To make a general purpose method for timing I generally have a Timing class consisting of the following.

public record TimedResult<T>(T result, Duration duration) {}

public static Duration time(Runnable r) {
    var s = Instant.now();
    r.run();
    var dur = Duration.between(s, Instant.now());
    return dur;
}

public static <T> TimedResult<T> time(Callable<T> r) throws Exception {
    var s = Instant.now();
    T res = r.call();
    var dur = Duration.between(s, Instant.now());
    return new TimedResult<>(res, dur);
}

This is general enough to pass a Runnable or Callable.

Duration result = Timing.time(() -> {
    // do some work.
});

TimedResult<String> result = Timing.time(() -> {
    // do some work.
    return "answer";
});

Duration timeTaken = result.duration();
String answer = result.result();

Solution 42 - Java

Pure Java SE code, no need for adding dependency, using TimeTracedExecuter :

public static void main(String[] args) {

    Integer square = new TimeTracedExecutor<>(Main::calculateSquare)
                .executeWithInput("calculate square of num",5,logger);
    
}
public static int calculateSquare(int num){
    return num*num;
}

Will produce result like this:

INFO: It took 3 milliseconds to calculate square of num

Custom reusable class: TimeTracedExecutor

import java.text.NumberFormat;
import java.time.Duration;
import java.time.Instant;
import java.util.function.Function;
import java.util.logging.Logger;

public class TimeTracedExecutor<T,R> {
    Function<T,R> methodToExecute;

    public TimeTracedExecutor(Function<T, R> methodToExecute) {
        this.methodToExecute = methodToExecute;
    }

    public R executeWithInput(String taskDescription, T t, Logger logger){
        Instant start = Instant.now();
        R r= methodToExecute.apply(t);
        Instant finish = Instant.now();
        String format = "It took %s milliseconds to "+taskDescription;
        String elapsedTime = NumberFormat.getNumberInstance().format(Duration.between(start, finish).toMillis());
        logger.info(String.format(format, elapsedTime));
        return r;
    }
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionOgre Psalm33View Question on Stackoverflow
Solution 1 - JavaDiastrophismView Answer on Stackoverflow
Solution 2 - JavaMBCookView Answer on Stackoverflow
Solution 3 - JavaDmitry KalashnikovView Answer on Stackoverflow
Solution 4 - JavaSufiyan GhoriView Answer on Stackoverflow
Solution 5 - JavaYashView Answer on Stackoverflow
Solution 6 - JavaJames SchekView Answer on Stackoverflow
Solution 7 - JavaTondaCZEView Answer on Stackoverflow
Solution 8 - JavaskaffmanView Answer on Stackoverflow
Solution 9 - JavaStefanView Answer on Stackoverflow
Solution 10 - JavaNarayanView Answer on Stackoverflow
Solution 11 - JavaBasil BourqueView Answer on Stackoverflow
Solution 12 - JavaHans-Peter StörrView Answer on Stackoverflow
Solution 13 - JavamurdochjohnView Answer on Stackoverflow
Solution 14 - JavaicebergView Answer on Stackoverflow
Solution 15 - JavaSunil ManheriView Answer on Stackoverflow
Solution 16 - JavamergenchikView Answer on Stackoverflow
Solution 17 - JavaPratik PatilView Answer on Stackoverflow
Solution 18 - Javayegor256View Answer on Stackoverflow
Solution 19 - JavaMaciek KreftView Answer on Stackoverflow
Solution 20 - JavalukeView Answer on Stackoverflow
Solution 21 - JavaHorst GutmannView Answer on Stackoverflow
Solution 22 - JavaJustinas JakavonisView Answer on Stackoverflow
Solution 23 - JavaBhaskara AraniView Answer on Stackoverflow
Solution 24 - JavaDavid NehmeView Answer on Stackoverflow
Solution 25 - JavaRyan RodemoyerView Answer on Stackoverflow
Solution 26 - JavaanjanbView Answer on Stackoverflow
Solution 27 - JavaDenis KutlubaevView Answer on Stackoverflow
Solution 28 - JavaleoView Answer on Stackoverflow
Solution 29 - JavamsysmiluView Answer on Stackoverflow
Solution 30 - Javapraveen jainView Answer on Stackoverflow
Solution 31 - JavagifpifView Answer on Stackoverflow
Solution 32 - Javaakhil_mittalView Answer on Stackoverflow
Solution 33 - JavaAlexey PismenskiyView Answer on Stackoverflow
Solution 34 - JavadingjshView Answer on Stackoverflow
Solution 35 - JavatimxorView Answer on Stackoverflow
Solution 36 - JavaStationaryTravellerView Answer on Stackoverflow
Solution 37 - JavahmitcsView Answer on Stackoverflow
Solution 38 - JavaMaciel Escudero BombonatoView Answer on Stackoverflow
Solution 39 - JavaAska FedView Answer on Stackoverflow
Solution 40 - Javajhenya-dView Answer on Stackoverflow
Solution 41 - JavaBrett RyanView Answer on Stackoverflow
Solution 42 - JavaAhmad HoghooghiView Answer on Stackoverflow