2011-10-16 1 views
6

거리의 Word는 스칼라의 for 루프가 while 루프보다 느립니다.hprof를 사용하여 루프에 대한 스칼라 프로파일 링

느린 :

for (i <- 0 until 10000) { 
    f(i) 
} 

빠른 :

var i = 0 
while (i < 10000) { 
    f(i) 
    i += 1 
} 

어떻게 루프에 대한 내 코드에서 병목 여부를 알려 HPROF를 사용합니까? -agentlib:hprof=cpu=samples을 사용하여 코드를 프로파일 링하는 중이며, "CPU 샘플"섹션의 메소드는 무엇입니까?

내 최적화 작업에 집중해야 할 부분을 알고 싶습니다. 루프에 병목 현상이 있습니까?

답변

3

yourkit 또는 visualvm과 같은 프로파일 링 도구를 사용하면 더 많은 행운이 생길 것입니다.

이들은 보통 CPU 샘플을 캡처 한 다음 드릴 다운하여 대부분의 CPU 사이클을 소비 한 호출을 확인합니다.

임의의 종류의 병목 현상이 나타나고 (CPU 시간의 95 %를 차지하는 것과 같은) 병목 현상이 발생하여 해당 핫 스폿의 호출 스택에있는 메서드 (또는 라이브러리)가 나타날 때까지 드릴 다운 할 수 있습니다. 그러면 for 루프가 관련되는지 알 수 있습니다.

2

각 루프를 자체 메서드에 넣은 다음 메서드가 수행 한 시간을 비교하십시오. 그리고 실제로 충분한 시간을내어 (또는 다른 루프에서 감싸는) 충분한 반복을 사용하십시오. 10000 반복은 마이크로 초가 걸립니다. 프로파일 러가 측정하기 란 어렵습니다. 10 억 회 (또는 10k 회 반복의 100k 반복)를 시도하십시오.

또한 f(i)이 비싸면 루프보다 훨씬 많은 시간이 걸릴 것입니다. 또한 f(i)이 실제로 아무 것도하지 않으면 최적화가 완전히 해제 될 수 있습니다. 그러니 어딘가에 카운터를 업데이트하거나 합계를 계산하는 등의 작업을 수행하십시오.