Какой самый эффективный, «дешевый» и точный способ измерения времени в Java с точностью до микросекунд? - PullRequest
0 голосов
/ 25 февраля 2011

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

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

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

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

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

Ответы [ 2 ]

6 голосов
/ 25 февраля 2011

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

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

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

2 голосов
/ 25 февраля 2011

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

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

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


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

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

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

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