프로그래밍 언어/JAVA

Java에서 올바른 마이크로 벤치 마크를 작성하는 방법

Rateye 2021. 7. 6. 10:22
728x90
반응형

질문 : Java에서 올바른 마이크로 벤치 마크를 작성하려면 어떻게해야합니까?

Java에서 올바른 마이크로 벤치 마크를 어떻게 작성 (및 실행)합니까?

고려해야 할 다양한 사항을 설명하는 몇 가지 코드 샘플과 주석을 찾고 있습니다.

예 : 벤치 마크는 시간 / 반복 또는 반복 / 시간을 측정해야하며 그 이유는 무엇입니까?

관련 : 스톱워치 벤치마킹이 허용됩니까?

답변

Java HotSpot 제작자의 마이크로 벤치 마크 작성에 대한 팁 :

규칙 0 : JVM 및 마이크로 벤치마킹에 대한 평판 좋은 논문을 읽으십시오. 좋은 사람은 Brian Goetz, 2005 입니다. 마이크로 벤치 마크에서 너무 많은 것을 기대하지 마십시오. 제한된 범위의 JVM 성능 특성 만 측정합니다.

규칙 1 : 타이밍 단계 전에 모든 초기화 및 컴파일을 트리거하기에 충분한 테스트 커널을 실행하는 준비 단계를 항상 포함합니다. (워밍업 단계에서는 반복 횟수를 줄여도 좋습니다. 경험상 수만 번의 내부 루프 반복을 사용하는 것이 좋습니다.)

규칙 2 : 항상 -XX:+PrintCompilation , -verbose:gc 등을 사용하여 실행하므로 컴파일러 및 JVM의 다른 부분이 타이밍 단계 동안 예상치 못한 작업을 수행하지 않는지 확인할 수 있습니다.

규칙 2.1 : 타이밍 및 준비 단계의 시작과 끝에서 메시지를 인쇄하여 타이밍 단계 동안 규칙 2에서 출력이 없는지 확인할 수 있습니다.

규칙 3 : -client-server , OSR 및 일반 컴파일의 차이점을 인식하십시오. -XX:+PrintCompilation 플래그는 비 초기 진입 점을 나타내는 at 기호를 사용하여 OSR 컴파일을보고합니다 (예 : Trouble$1::run @ 2 (41 bytes) . 최상의 성능을 원한다면 서버보다 클라이언트를 선호하고 OSR을 정기적으로 선호하십시오.

규칙 4 : 초기화 효과에 유의하십시오. 인쇄는 클래스를로드하고 초기화하므로 타이밍 단계에서 처음으로 인쇄하지 마십시오. 특별히 클래스로드를 테스트하지 않는 한 (그리고이 경우 테스트 클래스 만로드) 준비 단계 (또는 최종보고 단계) 외부에서 새 클래스를로드하지 마십시오. 규칙 2는 이러한 효과에 대한 첫 번째 방어선입니다.

규칙 5 : 최적화 해제 및 재 컴파일 효과에 유의하십시오. 타이밍 단계에서 처음으로 코드 경로를 사용하지 마십시오. 컴파일러는 경로가 전혀 사용되지 않을 것이라는 이전의 낙관적 가정을 기반으로 코드를 정크 및 재 컴파일 할 수 있기 때문입니다. 규칙 2는 이러한 효과에 대한 첫 번째 방어선입니다.

규칙 6 : 적절한 도구를 사용하여 컴파일러의 마음을 읽고 그것이 생성하는 코드에 놀라게 될 것입니다. 무언가를 더 빠르게 또는 더 느리게 만드는 것에 대한 이론을 형성하기 전에 코드를 직접 검사하십시오.

규칙 7 : 측정시 노이즈를 줄이십시오. 조용한 시스템에서 벤치 마크를 실행하고 여러 번 실행하여 이상 값을 제거합니다. -Xbatch 를 사용하여 컴파일러를 응용 프로그램과 직렬화하고 -XX:CICompilerCount=1 을 설정하여 컴파일러가 자체적으로 병렬로 실행되지 않도록합니다. GC 오버 헤드를 줄이기 위해 최선을 다하고 Xmx (충분히 크게)를 XmsUseEpsilonGC 를 사용하십시오.

규칙 8 : 벤치 마크에 라이브러리를 사용하십시오. 아마도 더 효율적이고이 유일한 목적을 위해 이미 디버깅 되었기 때문입니다. JMH , Caliper 또는 Bill and Paul 's Excellent UCSD Benchmarks for Java .

출처 : https://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java
728x90
반응형