Как мне рассчитать время выполнения метода в Java? - PullRequest
757 голосов
/ 08 октября 2008

Как получить время выполнения метода? Существует ли служебный класс Timer для таких вещей, как определение времени, сколько времени занимает задача и т. Д.?

Большинство запросов в Google возвращают результаты для таймеров, которые планируют потоки и задачи, а это не то, что мне нужно.

Ответы [ 37 ]

1 голос
/ 29 декабря 2016

Я реализовал простой таймер, и я думаю, что он действительно полезен:

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;
    }

}

Таким образом, вы можете рассчитывать одно или несколько действий:

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.");
1 голос
/ 15 декабря 2016

Вот довольно напечатанная строка, готовая к форматированию, прошедшая секунда, похожая на поиск в Google, заняла время:

        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)
1 голос
/ 16 января 2015

Было бы хорошо, если бы у java была лучшая функциональная поддержка, чтобы действие, которое нужно измерить, можно было заключить в блок:

measure {
   // your operation here
}

В Java это может быть сделано анонимными функциями, которые выглядят слишком многословно

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);
        }
    }
}
1 голос
/ 17 сентября 2014

Измерения производительности на моей машине

  • System.nanoTime (): 750 нс
  • System.currentTimeMillis (): 18 нс

Как уже упоминалось, System.nanoTime (), как считается, измеряет прошедшее время. Просто будьте в курсе стоимости, если использовали петлю или тому подобное.

1 голос
/ 21 сентября 2015

Вы можете использовать javaagent для изменения байтов класса java, динамически добавлять коды монитора. На github есть несколько инструментов с открытым исходным кодом, которые могут сделать это за вас.
Если вы хотите сделать это самостоятельно, просто внедрите javaagent , используйте javassist , чтобы изменить методы, которые вы хотите отслеживать, и код монитора перед тем, как ваш метод return.it станет чистым, и вы может отслеживать системы, у которых даже нет исходного кода.

1 голос
/ 03 июля 2013

System.nanoTime() - довольно точная системная утилита для измерения времени выполнения. Но будьте осторожны, если вы работаете в режиме упреждающего планировщика (по умолчанию), эта утилита фактически измеряет время настенных часов, а не время процессора. Таким образом, вы можете заметить различные значения времени выполнения от запуска к запуску, в зависимости от загрузки системы. Если вы ищете процессорное время, я думаю, что запуск вашей программы в режиме реального времени поможет. Вы должны использовать RT Linux. ссылка: Программирование в реальном времени с Linux

0 голосов
/ 06 июля 2017

Стратегия, которая работает для меня в Java ee:

  1. Создать класс с методом, аннотированным @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. Аннотируйте метод, который вы хотите контролировать:

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...