Как найти время, необходимое для запуска Java-программы? - PullRequest
30 голосов
/ 11 июля 2011

У меня есть приложение на Java, над которым я работаю, и я только что понял, что программа должна вернуть значение менее чем за минуту, но не знаю, как найти или отобразить время, затраченное на запуск программы , Как найти время, необходимое для запуска программы?

Ответы [ 7 ]

74 голосов
/ 11 июля 2011

Вы можете сравнить время, используя System.nanoTime().Это вернет время в наносекундах.

Возвращает текущее значение наиболее точного из доступных системных таймеров в наносекундах.

Вы можете использовать его следующим образом:

long startTime = System.nanoTime();

// code

long endTime = System.nanoTime();
System.out.println("Took "+(endTime - startTime) + " ns"); 

Полезные ссылки:

13 голосов
/ 11 июля 2011

Нет встроенного способа узнать, как долго работает ваша программа.Однако в начале программы вы можете просто сохранить текущее время, чтобы через некоторое время вы могли видеть, сколько времени прошло.

public class MyProgram {
    private static long startTime = System.currentTimeMillis();

    public static void main(String[] args) {
        // Do stuff...

        // At the end
        long endTime = System.currentTimeMillis();
        System.out.println("It took " + (endTime - startTime) + " milliseconds");
    }
}
2 голосов
/ 27 июня 2016

Если у вас есть Spring в качестве зависимости вашего проекта (или вы не против добавить его), вы можете использовать StopWatch. Как следует из названия, после инициализации он будет считать время, пока вы его не остановите. Затем вы можете проверить время, необходимое для выполнения задачи. Несколько StopWatches могут использоваться одновременно для нескольких задач, поддерживая код в чистоте.

Помимо поддержания чистоты вашего кода, StopWatches помогает с форматированием времени и другими служебными методами.

public void myMethod(){
    StopWatch stopWatch = new StopWatch();

    stopWatch.start("Task1");
    // ...
    // Do my thing
    // ...
    stopWatch.stop();
    System.out.println("Task executed in " + stopWatch.getTotalTimeSeconds() + "s");
}
1 голос
/ 27 июня 2018

Вы можете использовать 2 API, предоставляемые System class

  1. System.currentTimeMillis () Если код занимает время в миллисекундном диапазоне
  2. System.nanoTime () Если код занимает время в наносекундном диапазоне

Пример кода

public class TestTimeTaken {
    public static void main(String args[]) throws InterruptedException{
        long startTimeNanoSecond = System.nanoTime();
        long startTimeMilliSecond = System.currentTimeMillis();

        //code
        Thread.sleep(1000);
        //code

        long endTimeNanoSecond = System.nanoTime();
        long endTimeMilliSecond = System.currentTimeMillis();

        System.out.println("Time Taken in "+(endTimeNanoSecond - startTimeNanoSecond) + " ns");
        System.out.println("Time Taken in "+(endTimeMilliSecond - startTimeMilliSecond) + " ms");


    }
}
1 голос
/ 11 июля 2011

Если вы просто хотите узнать, как долго работает ваша программа, используйте System.currentTimeMillis () в начале и конце вашей программы.

0 голосов
/ 13 мая 2019

Мне нравится использовать класс Apache Commons StopWatch, когда у меня есть библиотека.

import org.apache.commons.lang3.time.StopWatch;

// ...

StopWatch stopWatch = new StopWatch();
String message = "Task : %s (%s) seconds";

// ...

stopWatch.split();
System.out.println(String.format(message, "10", stopWatch.toSplitString()));

// ...

stopWatch.split();
System.out.println(String.format(message, "20", stopWatch.toSplitString()));

stopWatch.stop();

0 голосов
/ 11 июля 2011

Это типичный вариант использования для аспектов, например, с использованием Spring AOP :

@Aspect
public class TimerAspect {

    private static final Logger LOG = Logger.getLogger(TimerAspect.class);

    @Around("com.xyz.myapp.MyClass.myMethod()")
    public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
        long startTime = System.nanoTime();
        Object retVal = pjp.proceed();
        long endTime = System.nanoTime();
        LOG.info(String.format("Call to %s.%s with args %s took %s ns", pjp.getTarget(), pjp.getSignature(), Arrays.toString(pjp.getArgs()), endTime - startTime));
        return retVal;
    }
}

А в контексте вашего приложения:

<aop:aspectj-autoproxy/>
<bean id="myAspect" class="org.xyz.TimerAspect"/>   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...