2017-01-03 3 views
2

У меня есть приложение , которое я хочу сравнить с помощью JMH. Любая ссылка для этой интеграции будет полезна.Бенчмаркинг с пружинным ботинком с JMH

+0

IMHO 'jmh' не подходит для бенчмаркинга, но только для определенных методов. –

+1

Мне удалось сделать bechmarking для весеннего приложения MVC. Они должны быть способ сделать это для приложений Spring-загрузки –

ответ

5

Решение было довольно легким, чем я думал. Важная часть состоит в том, чтобы запустить приложение Spring-Boot, когда эталонный процесс инициализируется. Определите переменную уровня класса для контекста конфигурации и дайте ссылку на нее во время настройки эталона. Вызовите метод bean внутри теста.

import java.io.File; 
import java.net.URL; 
import java.net.URLClassLoader; 
import java.util.concurrent.TimeUnit; 
import org.openjdk.jmh.annotations.Benchmark; 
import org.openjdk.jmh.annotations.BenchmarkMode; 
import org.openjdk.jmh.annotations.Level; 
import org.openjdk.jmh.annotations.Mode; 
import org.openjdk.jmh.annotations.OutputTimeUnit; 
import org.openjdk.jmh.annotations.Scope; 
import org.openjdk.jmh.annotations.Setup; 
import org.openjdk.jmh.annotations.State; 
import org.openjdk.jmh.infra.Blackhole; 
import org.openjdk.jmh.runner.Runner; 
import org.openjdk.jmh.runner.options.Options; 
import org.openjdk.jmh.runner.options.OptionsBuilder; 
import org.springframework.boot.SpringApplication; 
import org.springframework.context.ConfigurableApplicationContext; 

@BenchmarkMode(Mode.Throughput) @OutputTimeUnit(TimeUnit.MINUTES) 
@State(Scope.Thread) 
public class ProcessFeedBenchMark { 

    public static void main(String args[]) throws Exception { 
     URLClassLoader classLoader = (URLClassLoader) ProcessFeedBenchMark.class.getClassLoader(); 
     StringBuilder classpath = new StringBuilder(); 
     for(URL url : classLoader.getURLs()) 
      classpath.append(url.getPath()).append(File.pathSeparator); 
     classpath.append("/D:/work/zymespace/benchmark/src/main/resources/").append(File.pathSeparator); 
     System.out.print(classpath.toString()); 
     System.setProperty("java.class.path", classpath.toString()); 

     Options opt = new OptionsBuilder() 
     .include(ProcessFeedBenchMark.class.getName() + ".*") 
     .timeUnit(TimeUnit.MILLISECONDS) 
     .threads(1) 

     .shouldFailOnError(true) 
     .shouldDoGC(true) 
     .build(); 

     new Runner(opt).run(); 
    } 
    static ConfigurableApplicationContext context; 

    private BenchmarkTestService service; 

    @Setup (Level.Trial) 
    public synchronized void initialize() { 
     try { 
      String args = ""; 
      if(context == null) { 
       context = SpringApplication.run(BenchmarkSpringBootStater.class, args); 
      } 
      service = context.getBean(BenchmarkTestService.class); 
      System.out.println(service); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    @Benchmark 
    public void benchmark1 (ProcessFeedBenchMark state, Blackhole bh) { 
     try { 
      service.li(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+3

Я бы не стал полагаться на число, которое вы выбрали из этого теста. Вероятно, вы полагаетесь на конфигурацию службы и любой механизм прокси. Кроме того, большая часть времени будет потрачена на печать результата. Скорее, вы должны вернуть значение сервиса из метода и позволить JMH обрабатывать escape. Это не то, как вы должны использовать JMH. –

+0

Оператор System.out.println удаляется, чтобы получить правильный тест для метода li(). –

+0

Фантастический, спасибо за пример. –

Смежные вопросы