글 수 83
예전에 하이텔 게제동 강좌게시판에 올렸던 글입니다.
제 목:[PROG] 정밀한 퍼포먼스 체크를 위한 짤막한 강좌 관련자료:없음 [502]
보낸이:유영천 (yuchi ) 2000-07-27 01:13 조회:1282
GetTickCoun()를 쓰면 밀리세컨드로 시간을 측정할 수 있습니다.
하지만 밀리세컨드는 컴퓨터한테는 엄청 긴 시간이죠.
이보다 정밀하게 시간을 측정할 수 있는 방법이 있습니다.
아시는 분들은 이미 아시겠지만...모르시는 분들을 위해 간단
하게 적어보도록 하겠습니다.
펜터임 이상의 cpu는 입력된 클럭을 카운트하고 있습니다.rdtsc란 명
령을 사용하면 클럭을 카운트 하는 time stamp counter의 내용을
edx:eax 레지스터로 저장해줍니다. time stamp counter는 64비트
로서 하위 dword는 eax에, 상위 dword는 edx에 저장됩니다.
설명 길게 할 것 없고 예제를 보도록 합시다.
우선 많이 쓰는 수학함수인 sin함수가 몇클럭 정도를 잡아먹는지
체크해보도록 하죠.
#include <math.h>
#include <stdio.h>
#include <windows.h>
int main()
{
DWORD dwhi;
DWORD dwlo;
__asm
{
rdtsc ; 클럭카운트를 edx:eax레지스터에 저장
mov dwhi,edx ;상위 dword 메모리에 백업
mov dwlo,eax ;하위 dword 메모리에 백업
}
sin(0.5f); // sin()함수 수행
__asm
{
rdtsc ; 클럭카운트를 edx:eax레지스터에 저장
sub eax,dwlo ; 현재 클럭카운트에서 sin()수행 전의
sub edx,dwhi ; 카운트를 빼서 몇 클럭을 소모했는지체크
mov dwlo,eax ; 하위 dword 값 저장
mov dwhi,edx ; 상위 dword값 저장
}
printf( "%dn",dwlo); // 결과 출력
return 0;
}
간단한 예제죠? 컴파일 해서 돌려보면 제 pc에선 1700-1900 사이가 나오는군요.
곧 평균 1800클럭 정도 소모한단 얘기죠.하위dword값만 놓고 계산했는데 만약
하위 dword에서 자리 올림으로 상위 dword값이 바뀌었다면 뺄샘은 다르게 해야할겁니다.귀찮아서 일단 skip했습니다.거의 대부분의 경우는 하위 32비트만 체크하면 됩니다.
또한 dwlo,dwhi로 mov할때의 클럭소모는 일단 무시했습니다.정확히 몇 클럭
나올진 모르겠습니다.했을 경우 cpu와 동일클럭 캐쉬를 가지고 있는 CPU에서 캐쉬히트했을 경우 1-2클럭 정도 소모되고 하프클럭 캐쉬의 cpu라면 좀 더 걸립니다.캐쉬 미스했을 경우는 수십에서 수백클럭 소모됩니다.
GetTickCount()가 너무 무디다고 생각하신 분들, rdtsc로 정밀하게 체크하세요.
그럼...
ps:dwLo,dwHi
제 목:[PROG] 정밀한 퍼포먼스 체크를 위한 짤막한 강좌 관련자료:없음 [502]
보낸이:유영천 (yuchi ) 2000-07-27 01:13 조회:1282
GetTickCoun()를 쓰면 밀리세컨드로 시간을 측정할 수 있습니다.
하지만 밀리세컨드는 컴퓨터한테는 엄청 긴 시간이죠.
이보다 정밀하게 시간을 측정할 수 있는 방법이 있습니다.
아시는 분들은 이미 아시겠지만...모르시는 분들을 위해 간단
하게 적어보도록 하겠습니다.
펜터임 이상의 cpu는 입력된 클럭을 카운트하고 있습니다.rdtsc란 명
령을 사용하면 클럭을 카운트 하는 time stamp counter의 내용을
edx:eax 레지스터로 저장해줍니다. time stamp counter는 64비트
로서 하위 dword는 eax에, 상위 dword는 edx에 저장됩니다.
설명 길게 할 것 없고 예제를 보도록 합시다.
우선 많이 쓰는 수학함수인 sin함수가 몇클럭 정도를 잡아먹는지
체크해보도록 하죠.
#include <math.h>
#include <stdio.h>
#include <windows.h>
int main()
{
DWORD dwhi;
DWORD dwlo;
__asm
{
rdtsc ; 클럭카운트를 edx:eax레지스터에 저장
mov dwhi,edx ;상위 dword 메모리에 백업
mov dwlo,eax ;하위 dword 메모리에 백업
}
sin(0.5f); // sin()함수 수행
__asm
{
rdtsc ; 클럭카운트를 edx:eax레지스터에 저장
sub eax,dwlo ; 현재 클럭카운트에서 sin()수행 전의
sub edx,dwhi ; 카운트를 빼서 몇 클럭을 소모했는지체크
mov dwlo,eax ; 하위 dword 값 저장
mov dwhi,edx ; 상위 dword값 저장
}
printf( "%dn",dwlo); // 결과 출력
return 0;
}
간단한 예제죠? 컴파일 해서 돌려보면 제 pc에선 1700-1900 사이가 나오는군요.
곧 평균 1800클럭 정도 소모한단 얘기죠.하위dword값만 놓고 계산했는데 만약
하위 dword에서 자리 올림으로 상위 dword값이 바뀌었다면 뺄샘은 다르게 해야할겁니다.귀찮아서 일단 skip했습니다.거의 대부분의 경우는 하위 32비트만 체크하면 됩니다.
또한 dwlo,dwhi로 mov할때의 클럭소모는 일단 무시했습니다.정확히 몇 클럭
나올진 모르겠습니다.했을 경우 cpu와 동일클럭 캐쉬를 가지고 있는 CPU에서 캐쉬히트했을 경우 1-2클럭 정도 소모되고 하프클럭 캐쉬의 cpu라면 좀 더 걸립니다.캐쉬 미스했을 경우는 수십에서 수백클럭 소모됩니다.
GetTickCount()가 너무 무디다고 생각하신 분들, rdtsc로 정밀하게 체크하세요.
그럼...
ps:dwLo,dwHi