2017-03-08 6 views
5

저는 jmh를 처음 접하고 스레드 뒤에 어떤 일이 일어나는지 이해하는 데 익숙합니다.JMH 상태 클래스 및 공유 된 비공유 상태

그래서 저는 읽기 시작하여 @State 주석을 붙잡고 비공유 상태를 공유했습니다.

나는이 예를 읽었습니다 : http://hg.openjdk.java.net/code-tools/jmh/file/ecd9e76155fe/jmh-samples/src/main/java/org/openjdk/jmh/samples/JMHSample_03_States.java 그리고 그것에 대해 몇 가지 질문이 있습니다.

첫 번째 질문은 무엇입니까? 주 수업의 정확한 역할은 무엇입니까? 매개 변수를 보유하고 있습니까? 두 가지 방법으로 키를 암호화하는 프로그램을 벤치마킹한다고 가정 해 봅니다. 특정 상태로 주석이 달린 상태 클래스에서 키 (String 객체)를 유지해야합니까? 또는 String 객체를 벤치 마크 클래스에 보관할 수 있습니까? 이것에 대한 설명은 훌륭합니다.

위의 예제에서 공유되지 않은 상태 클래스 성능이 공유 된 것보다 훨씬 좋은 이유는 무엇입니까? 다중 스레드 상태는 어떻게 변경합니까?

나는이 물건에 익숙하지 않아서 jmh를위한 "내가 5 인처럼 나에게 설명해"라는 옵션을 찾을 수 없었기 때문에 나는 정말로 어둡게 느껴졌습니다.

답변

2

@State 개체는 벤치 마크의 일부로 간주 할 수 있습니다. 생성 시간은 측정 된 시간의 일부로 간주되어야합니다.

우리는 당신이 계산하는 데 걸리는 시간을 측정하고자한다고 가정 해 봅시다 :

@Benchmark 
int benchmark() { 
    int foo = 1, bar = 1; 
    return foo + bar; 
} 

을 불행하게도 당신을, JIT 컴파일러는이 작업을 수행하고 간단하게 2를 반환하는 방법을 접을 것입니다 수 있도록 너무 똑똑하다 . 이것은 물론 당신이 측정하고자하는 것이 아닙니다. 상태를 사용하면 이러한 값을 벗어날 수 있고 JMH가 JIT 접기를 사용하지 않도록 할 수 있습니다. @Setup 메소드에서 값을 초기화합니다.

또 다른 사용 사례로, 귀하의 벤치 마크가 예상 한대로되었는지 확인할 수 있습니다. 이는 @TearDown 방법으로 상태의 유효성을 검사하여 가능합니다.

+0

벤치마킹 클래스에 변수를 저장하고 @Setup으로 변수를 초기화하거나 변수를 유지하고 초기화하는 내부 클래스를 만드는 것이 중요합니다. 아니면 이렇게하는 것이 2 가지 방법 일뿐입니다. – TalOhana

+0

첫 번째는 후자의 편의입니다. –