Какой самый эффективный, "дешевый" и точный способ измерения времени в Java с точностью до микросекунд?
Я использую инструментарий Java-байтового кода ASM, и моя цель - измерить время при каждом доступе к переменной.
** измерить время и журнал **
** переменный доступ **
Я ищу разрешение микросекунд. Он должен быть точным и, следовательно, достаточно дешевым (это означает, что мне не нужна функция или библиотека, для которых потребуется 10 мс).
я пробовал System.NanoTime()
(слишком дорого и дорого) и Calendar
(слишком свободно), но я ищу лучшую альтернативу.
2 ответа
System.nanotime()
это вызов нативного метода, если это слишком дорого для вас, то вы, вероятно, не сможете найти что-то подходящее для ваших нужд в Java.
Я не думаю System.nanotime()
потребуется 10 мс (если вы специально не сделаете что-то только для того, чтобы замедлить это), чтобы выполнить тоже время.
И, наконец, я не уверен, что микросекунды будут достаточно точными для времени доступа к свойствам, наносекунды могут быть более полезными.
... Я не хочу функцию или библиотеку, которая займет 10 мс, чтобы получить время
Во-первых, вы преувеличиваете. System.nanoTime()
не занимает 10 миллисекунд.
Во-вторых, я не думаю, что в чистой Java есть более быстрый путь. Возможно, вы сможете быстрее получить доступ к системным часам из собственного кода, но ваш код будет зависеть от платформы. (Кроме того, мое внутреннее чувство таково, что System.nanoTime()
сделает это как можно быстрее.)
Доступ к переменной может занять всего пару машинных инструкций, в зависимости от контекста и типа переменной, к которой вы обращаетесь. Это, вероятно, будет затоплено временем, затраченным на доступ к системному таймеру.
Кроме того, вставка вызовов метода в метод часов перед тем, как доступ к переменной может сделать доступ к переменной более длительным. Вызов метода может сделать недействительным содержимое регистров, в результате чего генератор кода вставит инструкции для повторного получения переменной из памяти.
Короче говоря, вставка кода для извлечения часов может дать вам ненадежные и вводящие в заблуждение временные числа. Потенциально вы можете получить более значимые числа, рассчитывая длинные последовательности инструкций... но даже это может дать вам фиктивные числа, если вы допустите ошибки в своей методологии сравнения.