제목이 너무 거창해서 꼭 낚시 같은데...
사실은 아주 간단한 팁입니다.
가령
char chArray[10000]; // 두 배열변수는 전역이라고 가정합시다.
int nArray[10000];
// 최적화 대상 루틴
for(int c = 0; c < 10000; c++) //A. 이쯤에 브레이크 포인트를 걸고.
{
nArray[c] = chArray[c] ;
}
를 최적화 시키고 싶다면,
이 부분을 간단히 코딩해서 실행합니다.
그러면 //A 에서 멈추겠죠.
ALT+CTRL+C 를 눌러 CPU 창을 보면 최적화의 대상이 되는 부분의 어셈블리 코드가 보입니다.
그걸 그대로 가져다 어셈블리 코드를 작성합니다.
그런데, 2가지 문제가 있습니다. 어셈블리 명령을 그대로 복사했으면 좋겠는데
복사가 안됩니다. 보고 그냥 타이핑 해야 합니다.
둘째 이 코드는 최적화가 덜 된 코드라는 것입니다.
프로젝트 옵션에 최적화 부분을 speed 로 선택하면 좀 더 나은 속도를 위한 코드가 생성됩니다.
하지만 주의할 것은 언제나 speed 기준으로 하는 최적화가 항상 더 나은 것은 아니라는 사실입니다.
오히려 더 속도를 느리게도 하는 경우도 있을 수 있다고 알려져 있습니다.
최종 선택은 개발자가 직접 보고 해야 합니다.
위의 예보다 좀더 나은 최적화를 얻고 싶다면 도스창을 띄우고
bcc32 -S unit1.cpp 로 커맨드라인 컴파일을 하면
unit1.asm 의 순수 어셈블리 코드 파일을 만들 수 있는데,
이렇게 생성한 어셈블리 코드가 가장 최적화가 잘되어 있군요.
이것도 최종적으로는 개발자가 그 최적화의 정도를 판단해야 합니다.
그러면 그 코드를 옮겨 봅시다.
asm
{
xor eax,eax // int i = 0;
@8:
// nArray[i] = chArray[i]
movsx edx,byte ptr [eax+ chArray]
mov dword ptr [nArray+4*eax],edx
// i++
inc eax
// i < 10000
cmp eax,10000
jl short @8 // goto loop
}
이 정도면 더 이상의 최적화가 있을 수 없는 코드가 되었죠..
아.. 그런데 빌더가 한 최적화 보다 한단계 더 나가야 어셈블리 코드로 한 보람이 있는데
그냥 어셈블리로 만드는 방법만 설명한 셈이 되었네요.
그런데, 여기서 정말 극히 약간 더 빠르게 할수 있는 방법이 있는데 그건 각자 알아 보세요.
물론 어셈블리를 알면 이렇게 할것 없이 그냥 바로 코딩해도 되겠죠.
어쩌다가 엮인 팁이었습니다.
|
컴파일러가 만들어준 어셈코드를 그대로 코드로 옮기는건 무의미한 일 같습니다.