Как получить время выполнения малой долей, используя метод currentTimeMillis()

Мне нужно получить время выполнения функции в Java. Мне известны два метода, которые я могу использовать:currentTimeMillis(); а также nanoTime(); Но я узнал, что currentTimeMillis(); является более точным, если мне нужно время настенных часов (то есть, как будто я измеряю со настенных часов, сколько времени заняло выполнение. Не время обработки).

Но currentTimeMillis(); не может дать мне маленькое число дроби. Например, если время выполнения меньше 1 миллисекунды, возвращается 0. Мне нужно время, даже если оно меньше 1, скажем, 0,05 мс. Это простой пример, когда метод возвращает 0.

long startTime=System.currentTimeMillis();
for(int x=0; x<10;x++)
{
    System.out.println("-");
}

long execTime=System.currentTimeMillis() - startTime;

Даже если оно возвращает время, оно возвращает 30 или 40. Но мне нужно более точное число, скажем, 30,00012. Кроме того, метод возврата типа long но я изменил это на double как я хочу число с плавающей запятой, есть ли в этом вред? Можете ли вы сказать мне правильный способ, которым я могу измерить время выполнения моего Java-метода в виде небольшого числа дроби (например, не 8,0, а 8,287335)

3 ответа

Решение

Хотя вы можете и должны использовать nanoTime, чтобы получить максимально точное доступное время выполнения для блока кода. Тем не менее, вы должны использовать его с осторожностью, потому что есть много внешних проблем, которые могут повлиять на время выполнения.

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

JVM может трактовать метод по-разному, если он выполняется только один раз по сравнению с многократным.

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

Мне известны два метода, которые я могу использовать: currentTimeMillis() а также nanoTime(), Но я узнал, что currentTimeMillis() является более точным, если мне нужно время настенных часов (то есть, как будто я измеряю со настенных часов, сколько времени заняло выполнение. Не время обработки).

Это только отчасти верно.

Обе функции возвращают время настенных часов, а не процессорное время.

Разница, кроме точности, в том, что currentTimeMillis() относительно известного момента времени, тогда как nanoTime() относительно некоторого произвольного момента времени. Это означает, что вы не можете легко перевести результат nanoTime() в метку времени, которую вы и я бы поняли.

Вы все еще можете использовать его для измерения интервалов настенных часов: просто позвоните nanoTime() дважды и возьми разницу. Это в значительной степени то, для чего это было разработано.

Наконец, если вы используете это для профилирования некоторого кода, прочитайте Как мне написать корректный микробанчмарк в Java? Здесь много тонкостей.

Использование System.nanoTime() имеет точность наносекунды.

Другие вопросы по тегам