질문 : 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
(충분히 크게)를 Xms
와 UseEpsilonGC
를 사용하십시오.
규칙 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
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
Java에서 C++ Pairl에 해당하는 것 (0) | 2021.07.12 |
---|---|
다중 JFrame의 사용 : 좋은 습관인가? 나쁜 습관인가? (0) | 2021.07.08 |
JAVA의 날짜 연산에서 이상한 결과가 나오는 이유 (0) | 2021.07.06 |
macOS에서 기본 Java (JDK) 버전을 설정하거나 변경하는 방법 (0) | 2021.07.06 |
ISO 8601 호환 문자열을 java.util.Date로 변환 (0) | 2021.06.30 |