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

前端 未结 30 2728
北荒
北荒 2020-11-21 11:15
  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?

Mos

相关标签:
30条回答
  • 2020-11-21 11:39

    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;
        };
    }
    
    0 讨论(0)
  • 2020-11-21 11:41

    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.

    0 讨论(0)
  • 2020-11-21 11:41

    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;
      }
    
    0 讨论(0)
  • 2020-11-21 11:42

    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+

    0 讨论(0)
  • 2020-11-21 11:44

    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.

    0 讨论(0)
  • 2020-11-21 11:44

    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
    
    0 讨论(0)
提交回复
热议问题