Среда выполнения задачи Java
-
03-07-2019 - |
Вопрос
Прежде всего я должен признать, что это очень простые и примитивные вопросы...Я хочу продемонстрировать различные алгоритмы сортировки и поиска на Java, а также получить значение для среды выполнения.Есть проблемы, которые я не могу решить:
есть компиляция Hotspot - это оптимизация времени выполнения, которую мне нужно деактивировать (я думаю).
Как получить значения времени (секунды) для времени выполнения?Запуск таймера перед выполнением и остановка его после...кажется немного примитивным.И сам объект-таймер потребляет время выполнения...Мне нужно избегать этого.
Есть ли что-нибудь в Java API, которое можно было бы использовать для решения этих проблем?
Спасибо, Клаус
Решение
Использовать
-Xint
Флаг JVM.Другие варианты можно посмотреть здесь.Использовать
ThreadMXBean
API для получения времени процессора/пользователя для вашего потока.Пример можно увидеть здесь.
Другие советы
Вы можете отключить HotSpot с помощью -Xint
в командной строке, чтобы получить снижение производительности на порядок.Однако почему бы вам не измерить производительность в реальном мире?Различные вещи могут стать узкими местами при компиляции.
Обычно для микробенчмарков:
- использовать
System.nanoTime
чтобы получить измерение времени в начале и в конце - бежать в течение разумного периода времени
- проведите измерение несколько раз (есть некоторая «разминка»)
- не чередуйте измерения разных алгоритмов
- не делайте никаких операций ввода-вывода в измеряемом сегменте
- используйте результат (HotSpot может полностью оптимизировать тривиальные операции)
- сделайте это в реальной ситуации (или, если возможно, в клоэ)
- помните, что двухъядерность — это норма, и большее количество ядер станет нормой
Двойное использование System.nanoTime() занимает менее 1 микросекунды.Я предлагаю вам запустить любой тест на несколько секунд и взять среднее значение, чтобы ошибка в микросекунды не была значительной.
В целом, я бы посоветовал не усложнять ситуацию, чем вам нужно.
Чтобы иметь встроенную разминку, я часто игнорирую первые 10–20% итераций.Что-то вроде
long start;
int count;
for(int i = -count / 5; i < count; i++) {
if (count == 0) start = System.nanoTime();
// do tested code
}
long time = System.nanoTime() - start;
long average = time / count;
System.out.printf("Average time was %,d micro-seconds%n", average / 1000);