Измерение скорости в затмении, времени выполнения, времени выполнения
Я пытаюсь найти разумную возможность измерить скорость моей Java-программы / программных частей, например, чтобы проверить, какой из двух методов выполняется быстрее. Закомментируйте один из двух методов, определите время выполнения и, наконец, сравните время. Я не хочу использовать в моей программе какие-либо коды, такие как:
public long getTime() {
return System.currentTimeMillis();
}
Для кислорода затмения я попробовал встроенный в Eclipse профилировщик Java, который называется: JVM Monitor.
Но я получаю только сложные детали процессора, например, и другую информацию, не относящуюся ко времени выполнения моих методов. Или я что-то упустил.
Может быть, другой плагин от Eclipse Marketplaces более полезен и концентрируется только на времени выполнения?
1 ответ
JMH (Java Microbenchmark Harness) из OpenJDK должен соответствовать вашим потребностям:
JMH - это инструмент Java для сборки, запуска и анализа нано / микро / милли / макро тестов, написанных на Java и других языках, предназначенных для JVM.
Рекомендуемый способ запуска эталонного теста JMH - использовать Maven для настройки автономного проекта, который зависит от jar-файлов вашего приложения. Этот подход предпочтителен для обеспечения правильной инициализации тестов и получения надежных результатов. Можно выполнить тесты из существующего проекта и даже из среды IDE, однако настройка более сложна, а результаты менее надежны.
Вот простой подход к сравнительному анализу с JMH:
- Создать проект Maven, используя архетип jmh-java-benchmark-archetype
- Отредактируйте этот проект в Eclipse, чтобы создать код, который вы хотите протестировать, и создать JAR-файл.
- Запустите файл JAR из терминала / командной строки. JMH сделает свое дело и покажет результаты.
Чтобы дать вам лучшее представление, вот несколько тривиальных аннотированных кода для загрузки данных в HashMap:
import java.util.HashMap;
import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
public class MyBenchmark {
@Benchmark
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
public void testMethod() {
HashMap<Integer, String> map = new HashMap<>();
for (int i = 0; i < 1000; i++) {
map.put(i, "" + i);
}
}
}
Это был буквально весь код, необходимый для использования JMH, а класс и метод уже были созданы Maven; Я только что предоставил аннотации и четыре строки Java.
Конечно, это гораздо больше, чем получение полезной информации из JMH, но вы должны быть в состоянии запустить что-то в течение примерно 15 минут, если вы будете следовать одному из многочисленных онлайн-руководств. Openjdk также предоставляет 38 примеров кода.