Какой самый эффективный, "дешевый" и точный способ измерения времени в Java с точностью до микросекунд?

Я использую инструментарий Java-байтового кода ASM, и моя цель - измерить время при каждом доступе к переменной.

** измерить время и журнал **

** переменный доступ **

Я ищу разрешение микросекунд. Он должен быть точным и, следовательно, достаточно дешевым (это означает, что мне не нужна функция или библиотека, для которых потребуется 10 мс).

я пробовал System.NanoTime() (слишком дорого и дорого) и Calendar (слишком свободно), но я ищу лучшую альтернативу.

2 ответа

Решение

System.nanotime() это вызов нативного метода, если это слишком дорого для вас, то вы, вероятно, не сможете найти что-то подходящее для ваших нужд в Java.

Я не думаю System.nanotime() потребуется 10 мс (если вы специально не сделаете что-то только для того, чтобы замедлить это), чтобы выполнить тоже время.

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

... Я не хочу функцию или библиотеку, которая займет 10 мс, чтобы получить время

Во-первых, вы преувеличиваете. System.nanoTime() не занимает 10 миллисекунд.

Во-вторых, я не думаю, что в чистой Java есть более быстрый путь. Возможно, вы сможете быстрее получить доступ к системным часам из собственного кода, но ваш код будет зависеть от платформы. (Кроме того, мое внутреннее чувство таково, что System.nanoTime() сделает это как можно быстрее.)


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

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

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

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