Попытка измерить прошедшее время в Java - PullRequest
2 голосов
/ 28 февраля 2010

Мне не удалось заставить часы Java измерять время, прошедшее в миллисекундах с начала до конца простой программы.

Я скопировал программу ниже. Вы увидите, что я использовал утилиту Calendar, а затем напечатал время до и после цикла. Независимо от того, сколько времени занимает цикл, время, отображаемое командой печати до и после цикла, не изменяется.

Можете ли вы предложить решение?

Я использую DrJava.

import java.util.Calendar;

class time
{
  public static void main(String[] args)
  {

    int sum=0;
    int i=0;
    int j=0;
    int n=300;

    Calendar cal = Calendar.getInstance();

    System.out.println("Current milliseconds since 13 Oct, 2008 are :" + cal.getTimeInMillis());

    for (i=0;i < n; i++)
    {
      sum++;
      System.out.println("ROW " + i);  
    }

    System.out.println(" Current milliseconds since 13 Oct, 2008 are :" + cal.getTimeInMillis());
  } 
}

Ответы [ 7 ]

12 голосов
/ 28 февраля 2010

Используйте

System.nanoTime();

Для измерения прошедшего времени.

Это доступно начиная с Java 1.5, монотонный (где возможно, подробности метода ).

6 голосов
/ 28 февраля 2010

Если вы хотите точные измерения прошедшего времени, используйте System.nanoTime().

Из документации Java:

public static long nanoTime()

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

Этот метод может использоваться только для измерения прошедшего времени и не связан с каким-либо другим понятием системного или настенного времени. Возвращаемое значение представляет наносекунды с некоторого фиксированного, но произвольного времени (возможно, в будущем, поэтому значения могут быть отрицательными). Этот метод обеспечивает точность наносекунды, но не обязательно точность наносекунды. Нет никаких гарантий относительно того, как часто меняются значения. Различия в последовательных вызовах, которые охватывают более приблизительно 292 лет (263 наносекунды), не будут точно вычислять истекшее время из-за числового переполнения.

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

long startTime = System.nanoTime();
// ... the code being measured ...
long estimatedTime = System.nanoTime() - startTime;
4 голосов
/ 28 февраля 2010

Из документов:

Метод getInstance Календаря возвращает объект Календаря, поля календаря которого были инициализированы с текущей датой и временем:

Вы должны получить новый экземпляр после цикла и получить это время экземпляра в миллисекундах.

2 голосов
/ 28 февраля 2010
long start = System.currentTimeMillis();

/*** do stuff***/

double elapsed = (System.currentTimeMillis() - start) / 1000.0;
2 голосов
/ 28 февраля 2010

Кроме того, 300 итераций простого цикла вряд ли когда-либо будут регистрироваться вообще, даже если измеряться в миллисекундах. Возможно, вы захотите попробовать 300 тысяч (300000) итераций или более.

Также обратите внимание, что даже если getTimeInMillis() возвращает определенное количество миллисекунд, имейте в виду, что оно, вероятно, обновляется не так часто. Он может обновляться только каждые 10 миллисекунд или около того (когда происходит системный тик). Это полностью зависит от реализации вашей операционной системы.

1 голос
/ 28 февраля 2010

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

Календарь представляет собой момент времени с различными зависящими от локали операциями, а не чем-то похожим на работающий часовой механизм.

0 голосов
/ 28 февраля 2010

Как предположил Грег, вам следует выполнить большее количество итераций. Его аргумент действителен - и, по статистике, наличие большей выборки даст более точные результаты (это исключит случайные отклонения из-за неконтролируемых событий, таких как gc, enviroment и т.

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