Java 작업 런타임
-
03-07-2019 - |
문제
우선 이것들은 매우 기본적이고 원시적 인 질문임을 인정해야합니다. 정렬 및 검색을 위해 Java의 다른 알고리즘을 시연하고 런타임의 값을 얻고 싶습니다. 해결할 수없는 문제가 있습니다.
핫스팟 컴파일이 있습니다. 이는 비활성화 해야하는 런타임 최적화입니다 (추측).
런타임에 대한 시간 값 (초)은 어떻게 얻습니까? 실행 전에 타이머를 시작하고 나중에 중지하는 것은 약간 원시적 인 것 같습니다. 그리고 타이머 객체 자체는 런타임을 소비합니다 ... 나는 그것을 피해야합니다.
Java API에 이러한 문제를 해결하기 위해 활용할 수있는 것이 있습니까?
감사합니다, 클라우스
해결책
사용
-Xint
JVM 플래그. 다른 옵션을 볼 수 있습니다 여기.사용
ThreadMXBean
API는 스레드에 대한 CPU/사용자 시간을 얻습니다. 예를 볼 수 있습니다 여기.
다른 팁
핫스팟을 비활성화 할 수 있습니다 -Xint
명령 줄에서 성능이 크게 줄어 듭니다. 그러나 왜 실제 성능을 측정하고 싶지 않습니까? 컴파일하면 다른 것들이 병목 현상이 될 수 있습니다.
일반적으로 MicroBenchmarks의 경우 :
- 사용
System.nanoTime
시작과 끝에서 시간 측정을 얻으려면 - 합리적인 시간 동안 실행하십시오
- 측정을 여러 번 이상 수행하십시오 ( "워밍업"이 있습니다)
- 다른 알고리즘의 측정을 인터 리브하지 마십시오
- 측정 된 세그먼트에서 I/O를 수행하지 마십시오.
- 결과를 사용합니다 (핫스팟은 사소한 작업을 완전히 최적화 할 수 있습니다)
- 실제 상황 (또는 가능한 한 클로이)에서 수행하십시오.
- 이중 코어는 표준이라는 것을 기억하고 더 많은 코어가 정상이 될 것입니다.
System.nanoTime () 사용을 사용하면 1 마이크로 초 미만의 소비가 소비됩니다. 벤치 마크를 여러 초 동안 실행하고 평균을 취하여 마이크로 초 오류가 중요하지 않도록하는 것이 좋습니다.
전반적으로, 나는 당신이 필요로하는 것보다 더 복잡한 것을 만들지 않는 것이 좋습니다.
워밍업을 내장하기 위해 나는 종종 반복의 첫 10% -20%를 무시합니다. 같은 것
long start;
int count;
for(int i = -count / 5; i < count; i++) {
if (count == 0) start = System.nanoTime();
// do tested code
}
long time = System.nanoTime() - start;
long average = time / count;
System.out.printf("Average time was %,d micro-seconds%n", average / 1000);