[Autohotkey][외전2] C언어와 오토핫키 속도, 용량 및 메모리 차이 비교

Posted by 아이티프로13
2019. 5. 16. 23:26 프로그래밍/AutohotKey

 

 

 

안녕하세요. 쿠과자입니다.

원랜 GUI 쪽 강좌를 계속해야됬지만, 가끔씩 이런 질문을 하시는 분들이 계셔서 글을 써 봅니다.

 

C언어와 오토핫키, 얼마나 차이가 나나요?

 

이렇게 질문이 들어오면, 대부분 그냥 차이가 많이난다고만 합니다. 또한 이에 대한 자세한 자료도 없고요.

오늘은, 진짜로 얼마나 차이가 나는지, 메모리 용량이나 실제 용량, 그리고 사용 속도 면에서 비교해 보도록 하겠습니다.

 

사실 저도 이에 대해선 궁금했고, 한번쯤 확인해보고 싶었었습니다. 하지만 이런 작업은 처음 해보는거라, 강좌라기 보단 일종의 연구(??) 에 가깝다고 생각이 됩니다. ㅎㅎ;;

 

 

사전 작업 - 소스 코드

 

 

테스트를 위해서 C언어와 오토핫키에서 같은 기능을 하는 소스 코드를 작성해야 하기 때문에,

가장 간단한 마우스 클릭이나 키보드 입력 등도 있겠지만,

메시지박스 하나를 띄우는 예제를 가지고 비교를 해보도록 하겠습니다.

 

먼저 오토핫키로 작성한 코드입니다. 흔하디 흔한 Hello World 메시지박스입니다.

오토핫키 컴파일러 버전은 v1.1.30.1 ANSI로 컴파일했습니다.

 

#include "windows.h"
main()
{
	MessageBox(0, L"Hello World", L"", MB_OK);
	return 0;
}

 

마찬가지로 C 코드입니다. 최대한 간략히 하기위해 main함수 등도 다른 처리를 안하고 그대로 적었습니다.

VS 2017 버전으로 컴파일했습니다.

 

 

 

용량 및 메모리 차지 비교

 

 

 

먼저, 컴파일 후 용량을 확인해봅시다.

오토핫키로 컴파일한것은 대략 693KB, C로 컴파일한것은 대략 9KB로

대략 77배 차이가 나는것을 볼 수 있습니다.

 

 

다음으로, RAM상에 올려졌을때 얼마나 차이가 나는지 봅시다.

먼저, C언어의 파일을 IDA(아이다)로 분석했을때 입니다.

원래는 약간 더럽지만 C언어에서 컴파일 할때의 부산물(?)을 IDA가 분석해주기 때문에 쉽게 볼 수 있습니다.

 

빨간색 박스가 전체 소스 코드인데, 정확히 9줄입니다.

물론 call안에 추가적인 코드가 존재하지만, 이를 건너뛴다 치면 ASM상에서는 굉장히 짧은 코드지요.

 

 

 

다음으로, 오토핫키 코드입니다. 

약간... 복잡.. 해 보이죠?

사진에서 MessageBox는 마찬가지로 호출하는거지만, 위아래가 덕지덕지 많이붙은 모습입니다.

프로그램은 이게 전부가 아닙니다.

 

위의 수많은 코드박스 들 중 아래 큰걸 확대한게 위에서 올린 사진입니다.

 

그리고 심지어 저 사진 자체도 수많은 코드를 한참 돌아서 온거기때문에.. 차이가 엄청나다고 볼 수 있습니다.

 

 

좀 더 정확히 알기 위해서, 함수의 갯수를 봐봅시다.

C언어의 경우 첫번째 함수(main 함수) 에서 MessageBox를 호출하고, 총 73개의 부가적인 함수가 프로그램 상에서 존재하는 것을 알 수가있습니다.(물론 다 사용하는지 안하는지는 미지수입니다.)

 

 

다음으로, 오토핫키로 만든 프로그램입니다.

1563개의 함수 중에서 1066번째 함수에서 MessgeBox가 실행됩니다.

마찬가지로, 로드된 함수들이 모두 사용되진 않습니다.

 

실제 메모리 사용량을 확인해봅시다.

C언어로 만들어진 경우 메모리를 589824 bytes (약 576KB)를 이용하는걸 알 수 있습니다.

 

동일한 프로그램을 오토핫키로 만드는 경우,

5931008 bytes (약 5792KB)를 이용합니다.

무려 10배 정도의 메모리를 더 집어먹는단 말이죠.

 

 

 

실행 속도 비교

 

다음으로, 진짜 속도 비교입니다.

IDA의 Trace기능을 통해서 Messagebox를 띄우기까지 얼마나 많은 명령어들이 실행되는지를 통해 속도가 얼마나 차이나는지 비교해보겠습니다.

 

 

먼저, C언어 입니다.

좌측 하단에 보시면, 239개의 명령어가 실행된 후에 Hello World 창이 뜨는것을 확인할 수 있습니다.

 

 

다음으로, 오토핫키입니다.

무려 22069개의 명령어가 실행된 후에 Hello World 창이 뜨네요.

약 92.3 개의 명령어가 더 실행된 수치입니다.

단순무식하게 생각하면 무려 92.3 배나 C언어가 빠르단 소리죠.

 

결론

  C언어 오토핫키 차이
용량 차지 693KB 9KB 77배
메모리 차지 589824 bytes 5931008 bytes 10 배
실행 속도(명령어 실행 개수) 239개 22069개 92.3 배

 

결론적으로, 오토핫키는 C언어에 비해서 77배 크고, 10배정도 메모리를 더 잡아먹고, 92.3배 느리다는 결론을 얻었습니다. 물론 이는 간단한 환경에서 측정한 예상적인 수치이며, 특히 실행 속도 면에서 92.3배 느리다는 것은 최대값에 가까울 것입니다.

 

 

결과에 관한 고찰

그렇다면, 왜 오토핫키는 C언어에 비해서 느릴까요?

 

 

정답은 바로, 컴파일 방식에 있습니다.

C언어의 경우, "컴파일"언어라고 주로 말합니다. "컴파일"이라는 단어의 뜻이 쉽게 말하자면 C로 작성된 소스파일(Source File)을 기계어(ASM, 어셈블리어) 단위로 해석해 컴퓨터가 읽을수 있도록 함에 목적을 두고 있습니다.

또한, C언어는 엄청 대중화되어있고, 역사를 거듭하면서 그 컴파일러 또한 진화했기 때문에, 간단한 연산이나 기타 등등은 컴파일러가 최적화를 해주는 경우가 다반사입니다.

 

하지만, 오토핫키의 "컴파일" 개념은 조금 다릅니다.

오토핫키는, C언어와 달리 "스크립트" 언어입니다. 즉 스크립트(Script)를 짜서 그걸 오토핫키라는 인터프리터(Interpreter)에 집어넣는 방식이죠.

오토핫키에서 흔히 말하는 "컴파일"은 단순히 실행 파일로 만든다는 목적을 가지고 있습니다. 가장 쉽게 컴파일을 하는 방법은, 오토핫키 프로그램과 소스코드를 한번에 집어넣는 방법이겠죠. 이 방법을 오토핫키 컴파일러 또한 채용하고 있습니다.

그렇기 때문에, 오토핫키로 컴파일된 exe파일을 실행하면 오토핫키를 먼저 실행하고, 스크립트를 실행하는 방식으로 진행이 됩니다. 그런 도중에  오토핫키에서 지원 가능한 모든 모듈들(함수들)을 불러오고, 그 후에 스크립트를 불러와서 필요한거만 또 빼내요.. 이런 방식을 반복하는거죠. 그렇기 때문에 당연하게도 C로 만든 exe파일의 배의 용량, 메모리, 속도를 차지하는 것입니다.

 

 

 


 

 

 

저도 IDA로 분석을 하면서 느낀거지만 의외로 오토핫키와 C언어와의 속도차이가 생각보다 많아서 놀랐습니다.

하지만, 여러분들도 아시다시피 프로그램을 돌릴때는 특수 목적을 제외하고는 오토핫키는 C언어든 알고리즘, 코드를 어떻게 구현할건지가 속도를 좌지우지한다는 점을 꼭 말해드리고 싶습니다.

그럼, 재미있는 코딩하세요!