2015-02-26 3 views
1

у меня есть две реализации одного и того же пользовательского класса:JMH Бенчмаркинг - Сжатый способ сравнения выполнения альтернативных реализаций

private List<String> a = Util.myCustomClass(); 
private List<String> b = Util2.myCustomClass(); 

и хотели бы, чтобы сравнить время выполнения каждой из своих функций (которые все имеют такое же имя). В настоящее время мои эталонные тесты выглядеть следующим образом:

@Benchmark 
public boolean contains_val_a() { 
    return a.contains(val); 
} 

@Benchmark 
public boolean contains_val_b() { 
    return b.contains(val); 
} 

И я повторяю эту параллельную структуру 25 или около различных функций (написание каждой функции в два раза из-за двух реализаций). Есть ли способ для меня только написать 25 функций @Benchmark и запустить jmh для каждой функции для обеих реализаций?

ответ

1

Вы можете использовать @Param, чтобы определить (stringly) классов, которые вы хотите загрузить и иметь его инициализировать класс испытываемого в методе @Setup, как описано в данном примере: https://github.com/ktoso/sbt-jmh/blob/master/src/sbt-test/sbt-jmh/jmh-run/src/main/scala/org/openjdk/jmh/samples/JMHSample_27_Params.scala

В сущности

@Param(Array("a", "b")) 
val name: String = "" 

var thing: CommonInterface = "" 

@Setup 
def setup(): Unit = name match { 
    case "a" => new A 
    case "b" => new B 
} 

JMH затем включит столбец «param» в результатах теста, чтобы вы знали, какой результат был для какого значения.