JMH를 통한 스프링 부트 애플리케이션 벤치마킹
나는 있습니다spring boot
사용하여 벤치마킹하려는 애플리케이션JMH
이 통합에 대한 참조는 유용합니다.
해결책은 생각보다 쉬웠습니다.중요한 부분은 벤치마크가 초기화될 때 스프링 부트 애플리케이션을 시작하는 것입니다.구성 컨텍스트에 대한 클래스 수준 변수를 정의하고 벤치마크를 설정하는 동안 이 변수에 대한 참조를 제공합니다.벤치마크 내에서 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();
}
}
}
방법을 벤치마킹하기 위해 Spring 컨텍스트를 스핀업할 필요가 없습니다.실제로, 방법 구현이 변경되지 않고 있기 때문에 여기서 무엇을 벤치마킹하려고 하는지 잘 모르겠습니다.만약 당신이 원하는 것이 메소드의 시간을 맞추는 것이라면 메소드를 직접 호출하는 것이 훨씬 간단하고 오류가 발생하기 쉽습니다.다양한 상황에서 시작 시간을 벤치마킹하려면 여기에서 제 답변을 참조하십시오.
언급URL : https://stackoverflow.com/questions/41438519/benchmarking-spring-boot-application-with-jmh
'programing' 카테고리의 다른 글
phpexcel을 사용하여 셀에서 새 줄을 만드는 방법 (0) | 2023.07.23 |
---|---|
트리거에서 DELMITER //의 역할은 무엇입니까? (0) | 2023.07.23 |
유레카와 리본을 이용한 테스트 서비스 (0) | 2023.07.23 |
C에서 FILE 키워드는 정확히 무엇입니까? (0) | 2023.07.23 |
GETDATE()가 잘못된 식별자인 이유는 무엇입니까? (0) | 2023.07.23 |