AutoHotKey/강좌&정보

코드 최적화 Code Optimization

NineHeart 2023. 9. 15.

코드 최적화 Code Optimization

개발자는 깔끔하고 일관성있는 코드를 작성하는것이 중요합니다
규모가 큰 프로젝트를 진행중이라면 더욱 중요하죠, 코드의 상태가 프로그램의 유지보수에 많은 영향을 끼치기 때문에요

 

그래서 제가 코드를 최적화하기 위해 사용했던,하고있는 방법 몇가지를 소개하고자 합니다
많은 분들이 영감을 얻었으면 좋겠어요. 시작하겠습니다

 

01. 변수 값저장, 함수호출은 콤마로 연속해서 작성

 

변수에 값을 저장할때, 일반적으로는 아래처럼 코드를 작성합니다

 

이름 := "예지력"
성별 := "남성"
거주지 := "서울"

 

변수의 종류가 적은 경우, 위 처럼 작성해도 코드가 크게 길어지진 않지만
변수의 종류가 많은 경우에는 저장할때마다 다음줄로 넘겨주니 코드가 길어지죠


그런데 알고 계셨나요?

변수는 콤마(,)로 넘기면서 저장할 수 있습니다

 

이름 := "예지력", 성별 := "남성", 거주지 := "서울"

 

함수의 경우도 마찬가지입니다

 

함수1(), 함수2()

 

이는 깔끔한 코드를 유지할 수 있는것 뿐만 아니라 코드의 속도를 약 35% 높여줍니다

 

 

02. 비슷한 변수끼리는 오브젝트로 저장해두기

 

변수를 많이 사용하는 경우, 가끔 변수끼리 헷갈려 잘못 사용하거나 이름을 까먹는 경우가 있죠
비슷한 종류의 변수끼리는 함께 묶고싶은 경우도 있고요

 

이름1 := "예지력", 성별1 := "남성", 거주지1 := "서울"
이름2 := "독자", 성별2 := "여성", 거주지 := "서울"

 

이렇게 이름1,이름2,이름3.. 늘리며 저장하기엔 번거롭고, 나중에 변수를 사용할때도 헷갈릴 수 있습니다
이런 경우에, 변수를 오브젝트로 저장해두도록 하면 편하죠

 

시민1  := {이름: "예지력", 성별: "남성", 거주지: "서울"}
시민2 := {이름: "독자", 성별: "여성", 거주지: "서울"}
MsgBox % "시민1이름-" 시민1.이름 "`n시민1성별-" 시민1.성별 "`n시민1거주지-" 시민1.거주지

 

시민1.이름 := "변경된 이름"
시민1.성별 := "변경된 성별"
시민1.거주지 := "변경된 거주지"
MsgBox % "시민1이름-" 시민1.이름 "`n시민1성별-" 시민1.성별 "`n시민1거주지-" 시민1.거주지

 

 

03. 반복적으로 사용되는 명령어는 함수로

 

명령어...
Send, a
Send, b
Send, c

 

명령어...
Send, a
Send, b
Send, c
명령어...

 

위 코드에서 Send 부분이 반복적으로 사용되는걸 확인할 수 있습니다. 중복되는 부분은 함수로 묶어서 코드의 일관성을 높여보세요

 

명령어...
SendFunc()

 

명령어...
SendFunc()
명령어...

 

SendFunc()
{
 Send, a
 Send, b
 Send, c
}

 

 

04. 셋타이머, 핫키 라벨은 함수로 전환 (함수바인딩)

 

SetTimer, 라벨, ... 
Hotkey, F1, 라벨 ...

 

라벨:
명령어...
return

 

일반적으로 이렇게 사용하지만, 라벨의 사용은 코드의 깔끔함을 해치고, 유지보수가 힘들어집니다
오토핫키 공식도움말에서도 라벨의 사용을 권장하지 않습니다. 같은 이유로 goto 또한.

 

따라서, 함수를 사용해야겠는데... 그냥 라벨명에다가 함수이름적으면 되는게 아닙니다

 

함수를 하나의 변수(사실, 오브젝트)에 저장하고 라벨부분에 변수로 넘겨야해요

 

BindFunc := Func("함수명")     ; '함수명' 함수를 BindFunc오브젝트에 저장
SetTimer, %BindFunc%, ...       ; BindFunc 오브젝트를 라벨로써 사용
Hotkey, F1, %BindFunc% ...

 

함수명()
{
 명령어...
}

 

 

05. %변수% 를 많이 사용한다면 % 변수 로 통일

 

오토핫키에서 트레디셔널이라고 불리는 방식으로 변수를 표현할때는 %변수% 를 사용합니다
트레디셔널 방식으로  변수를 사용하려면 아래 코드처럼 적어야합니다

 

이름 := "예지력", 성별 := "남자", 거주지 := "서울"
MsgBox, %이름% %성별% %거주지%

 

히자만 익스프레션 표현식을 사용하면 이럴 필요가 없죠

 

이름 := "예지력", 성별 := "남자", 거주지 := "서울"
MsgBox, % 이름 성별 거주지

 

익스프레션에 대해 알아보려면 클릭하세요

 

06. 파일인스톨을 사용하는 경우, .zip 파일로

 

배포할 프로그램이 실행파일외에도 다른 리소스가 필요할때 파일인스톨로 함께 컴파일하곤 합니다

 

FileInstall, 1.png, %A_Temp%\1.png
FileInstall, 2.png, %A_Temp%\2.png
FileInstall, 3.png, %A_Temp%\3.png
FileInstall ... ;언제 다 적지?

 

그런데, 이렇게 코드를 작성하려면 굉장히 귀찮습니다
이 문제가 코드가 길어지고 더러워보이는거 보다 더 심각하죠

 

이런 경우에는 리소스파일을 .Zip으로 압축하고, 프로그램 실행시 .Zip의 압축을 풀면 되겠습니다
* 윈도우 네이티브 오브젝트를 이용하니 알집과 같은 외부툴이 없어도 됩니다

 

FileInstall, 리소스.zip, %A_Temp%\리소스.zip, 1  ;ZIP 파일


Zip := ComObjCreate("Shell.Application")  ;쉘 오브젝트 생성
Folder := Zip.NameSpace(A_Temp "\리소스.zip")   ; .ZIP 압축파일 지정, 여기서는 임시폴더(A_Temp)\리소스.zip
NewFolder := Zip.NameSpace(A_Temp)                ; 압축을 풀 경로 설정, 여기서는 임시폴더(A_Temp)


NewFolder.CopyHere(Folder.items, 4|16)          ; 압축해제, 임시폴더(A_Temp)에 리소스.zip 압축을 품, 항상 덮어씌움

                                                                      출처 : https://knowledgeisfree.tistory.com/109

※ 코드의 속도, 성능을 높이는 한줄 팁 모음

  • SetFormat 커맨드 사용을 자제하세요, 속도가 느려집니다
  • 기본환경변수를 제거해, 혹시모를 변수간의 충돌을 방지하고 성능을 높이기 위해서 #NoEnv 을 사용하세요
  • 오토핫키는 자동으로 최근 실행된 코드라인을 기억합니다, ListLines, Off 로 중지하세요
  • 오토핫키는 자체적으로 키로그를 남깁니다, #KeyHistory 0 으로 중지하세요
  • 프로세스의 우선순위를 높임으로서 성능향샹을 기대할 수 있습니다, Process, Priority,, High
  • Send 보다는 SendInput 을 사용하세요. 훨씬 빠르고 안정적(실행중엔 유저키입력 차단)이랍니다
  • 오토핫키는 기본적으로 라인마다 Sleep, 10 을 수행합니다, SetBatchLines, -1 으로 Sleep 을 제거해 속도를 높이세요
  • SetWinDelay SetControlDelay 를 사용해 Win Control 관련 명령어의 속도를 높이세요
  • SetKeyDelay SetMouseDelay 를 사용해 Send Mouse 관련 명령어의 속도를 높이세요
  • VarSetCapacity 를 통해 사이즈가 큰 문자열변수의 메모리를 미리 설정해 속도를 높일 수 있습니다
  • 단순 true, false를 비교하는 if, else일 경우 Ternary Operator 를 사용하는것이 더 빠릅니다
  • 초기실행이후 사용되지 않을 변수는 메모리에서 제거하세요 변수명 := "" 또는 VarSetCapacity(변수명,0)
  • 코드의 메모리가 높아 줄이고 싶다면 대기상태의 라인에 DllCall("psapi.dll\EmptyWorkingSet", "Ptr", -1) 을 추가하세요

 

'AutoHotKey > 강좌&정보' 카테고리의 다른 글

함수 Function 에 대한 이해  (0) 2023.09.15
RGB Hex Triplet Color Chart  (0) 2020.04.26
오토핫키 프로그램 사용에 대한 설명  (0) 2019.03.26