Суть вопроса такова, есть пакет алгоритмов сортировки, каждый алгоритм реализован в отдельном классе, как измерить время выполнения сортировки? nanoTime() и currentTimeMillis() как-то теряются в этом плане, nanoTime() в потоках курит, currentTimeMillis() точность хромает. Хелп, сеньоры. Желательно свои методы решения из жизненного опыта, а не ссылки на лекции и видеообзоры про таймстапы.
Подход один - запускаем один и тот же кусок кода с одними и теми же входными данными много-много (тысячу, миллион, 10 миллионов) раз. Меряем время чем-то простым, вроде currentTimeMillis(). Потом делим на количество запусков.
Мой процессор выйдет на свежий воздух погулять, если я применю этот подход для каждого алгоритма сортировки.(7 алгоритмов, + еще идет процесс дополнения алгоритмами).
Если один прогон занимает много времени, то повторите его 100 раз. Если лень ждать - 10 раз. Если данных много и один прогон - несколько секунд, то наносекундами точности можно принебречь. Если один прогон занимает микросекунды, то повторить его миллионы раз - не проблема.
Повторять и брать среднее в любом случае придется - чтобы избавится от случайностей и погрешностей. Один и тот же код на одних и тех же данных может выполнятся, например, от 10 до 20 миллисекунд.
currentTimeMillis() в любом случае будет давать искажённые данные. Просто при большом количестве запусков это будут усреднённые искажённые данные. Он подходит только для грубых замеров на скорую руку.
Сергей Горностаев, Любая функция измерения времени будет давать какую-то погрешность. Только повторами можно ее сделать сколь угодно малой. Во-вторых, очень точные методы, вроде аппаратных счетчиков, из джавы, по-моему, вообще не доступны, да и смысла в них для бенчмарка нет ни какого. Потому что даже если вы количество тактов процессора (куда уж точнее) мерять будете, у вас все-равно разброс будет. Время выполнения - это случайная величина, потому что зависит от миллиона разных факторов: что и как было в кэше, что операционка решила делать во время ваших тестов, какие были прерывания, да, в конце концов, как тепло распределилось в процессоре и памяти.
Поэтому гонять один и тот же код на одних и тех же данных много-много раз просто необходимо. Точность функции измерения времени в этих условиях отходит на второй план. Хотите точнее - повторите больше раз.
Там используется currentTimeMillis (line 268) и много повторений. Для академического сравнения алгоритмов, как у автора вопроса, тащить этого монстра смысла нет.
wataru, еще такой вопрос, как сделать это действие: "Для того чтобы компилятор java использовал наш управляющий класс, нужно создать файл META-INF/javax.annotation.processing.Processor, в котором должна быть прописана следующая строка:
annotations.time.TimeAnnotationProcessor"?