문제

우선 이것들은 매우 기본적이고 원시적 인 질문임을 인정해야합니다. 정렬 및 검색을 위해 Java의 다른 알고리즘을 시연하고 런타임의 값을 얻고 싶습니다. 해결할 수없는 문제가 있습니다.

  1. 핫스팟 컴파일이 있습니다. 이는 비활성화 해야하는 런타임 최적화입니다 (추측).

  2. 런타임에 대한 시간 값 (초)은 어떻게 얻습니까? 실행 전에 타이머를 시작하고 나중에 중지하는 것은 약간 원시적 인 것 같습니다. 그리고 타이머 객체 자체는 런타임을 소비합니다 ... 나는 그것을 피해야합니다.

Java API에 이러한 문제를 해결하기 위해 활용할 수있는 것이 있습니까?

감사합니다, 클라우스

도움이 되었습니까?

해결책

  1. 사용 -Xint JVM 플래그. 다른 옵션을 볼 수 있습니다 여기.

  2. 사용 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);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top