Вычитание System.currentTimeMillis (), дающее ноль - PullRequest
0 голосов
/ 31 октября 2011

Я пытаюсь отслеживать время в моей программе, используя System.currentTimeMillis () Однако, когда я пытаюсь вычесть время начала из времени окончания, результат равен нулю, когда я знаю, что это не должно быть. Я думаю, что это может иметь отношение к объявленному типу данных или приведению типов, которые могут быть необходимы. Как я могу исправить это, чтобы вычесть правильно и преобразовать результат в секунды?

См. Код:

long start=System.currentTimeMillis();
//some code executes....
    long end=System.currentTimeMillis();
    long result=end-start;
double seconds= TimeUnit.MILLISECONDS.toSeconds(result);

Ответы [ 5 ]

4 голосов
/ 31 октября 2011

Нет, ваш код в порядке. Скорее всего, миллисекунда просто не проходит. Попробуйте вместо этого использовать System.nanoTime().

РЕДАКТИРОВАТЬ: На самом деле, есть проблема с кодом. Согласно документам TimeUnit.convert «Преобразования из более мелких в более грубые гранулярности усекаются, поэтому теряют точность», поэтому, если результат меньше 1000, он будет равен 0.

Если вам нужны доли секунды, просто сделайте:

double seconds = result / 1000.0;

nanoTime все еще может быть полезным, но это может не быть проблемой, если код занимает достаточно много времени.

1 голос
/ 31 октября 2011

Большинство систем не могут разрешить ни одной миллисекунды. Обычно для каждого такта часы находятся в диапазоне от 100 до 200 миллисекунд. Это означает, что вы получаете «куски» миллисекунд. Это делает почти невозможным рассчитывать время так быстро, как ваша программа. Скорее всего, он начинается и заканчивается до того, как будет зарегистрирован другой тик.

Вам нужно использовать System.nanotime(), как предложено в другом месте. Также не конвертируйте долю секунды в секунду, ожидая в результате целую секунду. Ну, если вы не округлите UP.

1 голос
/ 31 октября 2011

Это ожидается - для выполнения первых двух строк, которые установят start и end, потребуется гораздо меньше секунды.Поэтому, когда вы сокращаете разницу до секунды, вы получаете ноль.

0 голосов
/ 31 октября 2011

System.currentTimeMillis () зависит от вашей платформы ОС и может быть недостаточно детализированным между вызовами методов для захвата необходимого периода времени. Вызов дважды, один за другим, вряд ли даст вам достаточную разницу во времени.

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

Существуют некоторые нативные библиотеки JNI для дополнительных методов Java 1.4 и Java 5 (getProcessCPUTime) для захвата более точных временных отметок, но я пока не могу найти конкретные детали.

0 голосов
/ 31 октября 2011

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

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