Считайте метрики с JMH

Как я могу использовать для расчета количества процессорного времени и памяти в JMH? Например, у меня есть: Код:

@State(Scope.Thread)
@BenchmarkMode(Mode.All)
public class JMHSample_My {

    int x = 1;
    int y = 2;

    @GenerateMicroBenchmark
    public int measureAdd() {
        return (x + y);
    }

    @GenerateMicroBenchmark
    public int measureMul() {
        return (x * y);
    }

    public static void main(String[] args) throws RunnerException {
        Options opt = new OptionsBuilder()
                .include(".*" + JMHSample_My.class.getSimpleName() + ".*")
                .warmupIterations(5)
                .measurementIterations(5)
                .forks(1)
                .build();

        new Runner(opt).run();
    }
}

Результат:

Benchmark                  Mode   Samples         Mean   Mean error    Units
JMHSample_My.measureAdd    thrpt         5  1060579.757    39506.950   ops/ms

JMHSample_My.measureMul    thrpt         5  1046872.684    79805.116   ops/ms

JMHSample_My.measureAdd     avgt         5        0.000        0.000    ms/op

JMHSample_My.measureMul     avgt         5        0.000        0.000    ms/op

JMHSample_My.measureAdd   sample   9549793        0.000        0.000    ms/op

JMHSample_My.measureMul   sample   9287002        0.000        0.000    ms/op

JMHSample_My.measureAdd       ss         5        0.001        0.000       ms

JMHSample_My.measureMul       ss         5        0.001        0.000       ms

Я вижу количество запросов на время, среднее время теста, но не вижу среднее количество загрузки ЦП и использование памяти. Это можно сделать с помощью JMH?


person Alex    schedule 25.03.2014    source источник
comment
Удалось ли вам получить показатели использования памяти? Добавление HotspotMemoryProfiler.class и GCProfiler.class не помогло. Единственная метрика, которую я получил, это ops/sec   -  person asgs    schedule 21.05.2017
comment
Неважно, я не вызывал свой основной класс, в котором я добавлял определенные классы Profiler, а основной класс Benchmarks.jar по умолчанию. Теперь я получаю такие показатели, как sun.gc.generation.0.space.0.used   -  person asgs    schedule 21.05.2017


Ответы (1)


Для использования памяти вы можете добавить профилировщик GC или HS_GC, используя метод addProfiler при создании параметров бегуна.

Что касается использования ЦП, тесты обычно и естественно потребляют 100% доступного ЦП. Однако вам следует проверить другие доступные профили, чтобы узнать, будут ли они предоставлять полезную для вас информацию.

person Oleg Estekhin    schedule 25.03.2014
comment
Спасибо, раньше профайлеров не замечал. Но измерения ЦП там нет. Пытаюсь реализовать через @AuxCounter. - person Alex; 26.03.2014
comment
Бенчмарк потребляет 100% или его поток. На 8-ядерном однопоточном тесте не будет потребляться 100% доступного ЦП. И для меня имеет значение, запускаю ли я 10 секунд на 8 ядрах в многопоточном режиме или 12 секунд на 1 ядре.... - Мне также интересно измерить процессорное время и эффективность многопоточного кода. - person Christian Fries; 16.05.2014
comment
@oleg Какая из множества метрик, сообщаемых HS_GC, на самом деле сообщает о потреблении памяти? sun.gc.metaspace.used выглядит наиболее многообещающе по имени, но это всего лишь предположение. В конце концов, число должно как-то отражать то, что будет предоставлять runtime.totalMemory() - runtime.freeMemory()runtime.totalMemory() - runtime.freeMemory()`. - person Holger Brandl; 13.04.2018