Как получить время выполнения малой долей, используя метод 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? Здесь много тонкостей.