2016-08-18 7 views
1

수천 라인의 거대한 프레임 워크와 일부 MB를 내 프로젝트에 추가하지 않고도 간단한 계산으로 CPU 계산 능력을 벤치 마크하려고합니다.CPU 계산 능력 벤치마킹

이 샘플 코드는 개발했습니다. 그것은 100 배나되는 큰 일을합니다. 이 거대한 임무 (benchmark() 함수)는 수학 복합 계산을 수행하고 100ms의 기간 동안 카운터를 증가시키는 잠시 동안 이루어집니다. 100ms마다 benchmark() 함수가 복잡한 수학 계산을 완료 한 횟수를 로그에 인쇄합니다.

좋아, 그래서, 그 계산에 화면에 100 번 인쇄했습니다.

첫 번째 시간은 내가 얻을 벤치 마크 실행 올바른 결과, 더 많거나 벤치 마크의 100 반복 각각에 대해 동일한 로그 결과 미만 :

08-18 13:09:52.806 26543-27748/com.mytestapp D/XXXX: Iteration: 0 Result: 118200 
08-18 13:09:52.906 26543-27748/com.mytestapp D/XXXX: Iteration: 1 Result: 171580 
08-18 13:09:53.006 26543-27748/com.mytestapp D/XXXX: Iteration: 2 Result: 170654 
08-18 13:09:53.106 26543-27748/com.mytestapp D/XXXX: Iteration: 3 Result: 168676 
08-18 13:09:53.206 26543-27748/com.mytestapp D/XXXX: Iteration: 4 Result: 168372 
08-18 13:09:53.306 26543-27748/com.mytestapp D/XXXX: Iteration: 5 Result: 165558 
08-18 13:09:53.406 26543-27748/com.mytestapp D/XXXX: Iteration: 6 Result: 171368 
08-18 13:09:53.506 26543-27748/com.mytestapp D/XXXX: Iteration: 7 Result: 171680 
08-18 13:09:53.606 26543-27748/com.mytestapp D/XXXX: Iteration: 8 Result: 171516 
08-18 13:09:53.706 26543-27748/com.mytestapp D/XXXX: Iteration: 9 Result: 171598 

그러나 수가 감소하기 시작 일부 실행 후

, 나는 왜 그런지 이해하지 못한다 :

08-18 13:10:20.850 26543-28161/com.mytestapp D/XXXX: Iteration: 1 Result: 94320 
08-18 13:10:20.951 26543-28161/com.mytestapp D/XXXX: Iteration: 2 Result: 90364 
08-18 13:10:21.051 26543-28161/com.mytestapp D/XXXX: Iteration: 3 Result: 94240 
08-18 13:10:21.152 26543-28161/com.mytestapp D/XXXX: Iteration: 4 Result: 93676 
08-18 13:10:21.252 26543-28161/com.mytestapp D/XXXX: Iteration: 5 Result: 91554 
08-18 13:10:21.352 26543-28161/com.mytestapp D/XXXX: Iteration: 6 Result: 94358 
08-18 13:10:21.452 26543-28161/com.mytestapp D/XXXX: Iteration: 7 Result: 90954 
08-18 13:10:21.552 26543-28161/com.mytestapp D/XXXX: Iteration: 8 Result: 94874 
08-18 13:10:21.652 26543-28161/com.mytestapp D/XXXX: Iteration: 9 Result: 94464 

잠시 기다렸다가 다시 시도하면 결과가 정상 값으로 다시 증가한다.

왜이 동작입니까? 이를 피하고 올바른 벤치 마크 결과를 얻는 방법은 무엇입니까?

이 내 예제 코드입니다 :

public void benchmarkIterator(){ 
    int result = 0; 
    int iterations = 100; 
    for (int i=0; i<iterations; i++){ 
     result = benchmark(); 
     Log.d("XXXX", "Iteration: "+i+" Result: "+result); 
    } 
} 

....

 public int benchmark(){ 
     long startTime = System.currentTimeMillis(); 
     int count=0; 
     double aux=0; 
     while((System.currentTimeMillis()-startTime)<100){ 
      count++; 
      double d = 7777777777d; 
      aux = 0; 
      aux=aux+(int)(aux+Math.sin(d)*Math.cos(d)); 
     } 
     return count; 
    } 
+0

더 큰 결과는 더 빠른 CPU를 의미합니다. 그 100 MS에서 더 많은 수학 작전이 만들어 졌다는 뜻인가요? 그것은 어떤 최적화 또는 JIT 물건 일 수 있을까? – Yazan

+0

결과가 높을수록 가장 빠른 수학 계산이이 CPU를 갖습니다 – NullPointerException

+0

열이 과열되고 열이 빠져 나갈 수 있습니까? – X3Btel

답변

1

과열? 아닙니다.이 계산으로 CPU가 땀을 흘릴 수 있습니다.

시간이 지남에 따라 변경 사항이 JVM 및 통계와 관련이 있다고 생각합니다. HotSpot 컴파일러는 코드를 사용하여 코드 분기를 최적화하는 데 사용합니다.

http://blog.takipi.com/jvm-performance-magic-tricks/

https://wiki.openjdk.java.net/display/HotSpot/PerformanceTechniques

당신이 무슨 일이 일어나고 있는지 알 수있는 유일한 방법은 프로파일 러를 사용하는 것입니다. 가비지 수집, 메모리 및 시간이 소비되는 곳을 확인해야합니다. 당신의 단순한 벤치마킹은 그런 통찰력을주지 못합니다.

+0

duffymo 제발, 당신이 내게이 문제를 해결하는 방법에 대한 도움을 줄 수 있습니까? 귀하의 링크로 그것을 해결할 수있는 방법을 찾을 수 없습니다. 고맙습니다. – NullPointerException

+1

해결할 문제가 없다고 생각합니다. JVM이 작동하는 방식이라고 지적하고 있습니다. 시간은 점근 적 값으로 더 많은 사례를 실행할 때 향상 될 것입니다. 응용 프로그램을 다시 시작하면 "워밍업"하고 새로운 통계 분기 모델을 축적해야합니다. 마이크로 벤치 마크가 속일 수있는 이유 중 하나입니다. – duffymo

+0

그래서 duffymo, 솔루션은 1000 반복을 실행하고 마지막 500의 결과 만 들어야합니까? – NullPointerException

0

정확하게 이해한다면, 두 개의 로그 스 니펫은 다른 JVM 시작으로 실행 된 다른 실행을위한 것입니까?

두 경우의 차이는 (재시작 된) JVM 때문일 수 없습니다.

차이점은 OS 파일 캐시 (이미 일부 파일이 계속됨), CPU 전원 관리 (CPU 빈도가 줄어들어 사용하지 않을 때 돌아갈 시간이 다소 걸릴 수 있음) 최대 빈도), 호스트에서 실행중인 다른 것 (VM 일 경우 많은 일들이 일어날 수 있음), CPU 최적화 (프리 페치의 분기 예측과 같은), ...

어쨌든, 당신은 요즘에는 컴퓨터/jvm/cpu가 작동하는 방식과 같은 문제가 있습니다 ...

+0

wtf, 그럼 안드로이드/자바에 대한 벤치 마크를 만드는 방법 ?? 또한 응용 프로그램의 동일한 실행에, 나는 같은 JVM 시작에 있어이 테스트를 만들려면 – NullPointerException

+0

벤치 버튼을 몇 번 누르십시오, 그것은 밖으로 걷어 차고 JVM을 내부 최적화 될 수 있습니다. 복잡하지만 일부 최적화는 JVM (핫스팟/JIT)에 의해 수행되며 일부 코드를 사용하지 않으면 일부 최적화가 취소 될 수도 있습니다. 벤치마킹은 실제로 어렵습니다. 이러한 종류의 마이크로 벤치마킹은 벤치마킹 도구로 수행해야 응용 프로그램이 아닌 JVM/OS 최적화를 피할 수 있습니다. JMH를 확인하십시오 : http://openjdk.java.net/projects/code-tools/jmh/ – loicmathieu

+0

정말 고마워요. – NullPointerException