Как измерить точное время выполнения процесса / метода, который часто прерывается? - PullRequest
3 голосов
/ 16 октября 2019

В настоящее время я получаю время для завершения процесса.

long start = System.currentTimeMillis();
process();
long end = System.currentTimeMillis();
long duration = stop - start;
System.out.println(duration);

Проблема, с которой я сталкиваюсь в настоящее время, заключается в том, что process() прерывается (приостанавливается) из-за гибернации моего компьютера, когда нет питания (Моя рабочая среда снаружи, поэтому я должен быть на батарее), так чтоможет продолжаться всякий раз, когда я перезагружаю компьютер, когда он подключен. Я полностью осознаю, что получу неправильную длительность, если, например, я не смогу перезапуститься примерно на 2 часа, так как процесс был приостановлен (во время гибернации), так как это будет означать, что дополнительные 2 часа будут приходиться на тактовую частоту процессора через батарею CMOSрезервное копирование при достижении строки

long end = System.currentTimeMillis();

. Как можно было бы получить точную продолжительность независимо от того, как процесс был приостановлен по отдельности.

1 Ответ

1 голос
/ 16 октября 2019

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

Однако ...

Есливаш процесс представляет собой набор отдельных шагов, вы могли бы сделать что-то вроде следующего:

List<Duration> durations = new ArrayList<>();
for(Step step : steps) {
    Instant stepStart = Instant.now();
    process(step);
    durations.add(Duration.between(stepStart, Instant.now()));
}

long totalMillis = durations.stream()
    .mapToLong(Duration::toMillis)
    .filter(ms -> ms < 1000)   // Cut off limit, to disregard hibernate steps
    .sum();

Это время каждого шага отдельно, и если время для шага занимает более 1 секунды, это не учитывается вОбщая. Вы также можете использовать «среднее» время для этих шагов, чтобы конечный результат был немного более реалистичным (конечно, это зависит от количества шагов, предполагаемого времени выполнения одного шага и т. Д.).

Это работает, только если есть хороший предел тому, что является «слишком большим» временем, и это дает менее точный результат. Если вы что-то делаете с BigInteger, вполне вероятно, что шаги с большими значениями занимают больше времени, поэтому одно значение отсечения не будет работать (хотя вы можете рассмотреть какое-то динамическое значение отсечения, основанное на вводе).

Самое дешевое, простое и лучшее решение: запустить код на сервере.

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