리루
VBA Function(or Subroutine) 수행시간 측정 & Array 리턴 함수의 잘못된 사용 본문
1. Array를 반환하는 함수를 오용한 서브루틴
Sub splitBadExample()
Dim str As String
Dim strTemp As String
Dim i As Integer
str = "이름 전화번호 이메일 주소"
For i = 0 To 3
strTemp = Split(str)(i)
Next i
End Sub
2. Array를 반환하는 함수 호출을 최소화한 서브루틴
Sub splitGoodExample()
Dim str As String
Dim strTemp As String
Dim strArr() As String
Dim i As Integer
str = "이름 전화번호 이메일 주소"
strArr = Split(str)
For i = 0 To 3
strTemp = strArr(i)
Next i
End Sub
위의 두 서브루틴의 속도를 비교해보자.
첫번째 함수는 Split()이라는 함수를 총 네번 호출하였다.
두번째 함수는 Split() 함수를 한번만 호출해 하나의 배열에 값을 넣어 계속 사용하였다.
Sub timeCheck()
Dim startTime As Double
startTime = Timer()
splitBadExample
Debug.Print (Timer() - startTime)
End Sub
위의 코드는 splitBadExample 서브루틴의 실행 시간을 측정하기 위한 서브루틴이다.
하지만 위의 코드를 수행하면 결과 값은 0이 나온다.
그 이유는 아무리 좋지 않은 방법으로 짜여진 함수라도 한번 수행하는데 걸리는 시간은 엄청 짧다는 것이다.
그렇다면, 어떻게 이 함수의 수행속도를 측정할 것인가?
Sub timeCheck()
Dim startTime As Double
Dim repetition As Double
Dim i As Double
repetition = 1000000
startTime = Timer()
For i = 0 To repetition
splitBadExample
Next i
Debug.Print ((Timer() - startTime) / repetition) * 1000
End Sub
위의 수정된 코드는 splitBadExample 서브루틴을 1,000,000번 수행한 시간을 측정해 함수를 수행한 횟수만큼
다시 나누어 준 값을 ms단위로 표현한 것이다.
결과는 0.010734375ms가 나왔다.
splitBadExample 서브루틴을 한번 수행하는 단위 시간은 0.01ms 라는 것이다.
그렇다면 splitGoodExample 서브루틴은 어떨까?
0.0053359375ms라는 경과가 나왔다. 약 두배의 속도 차이가 난다는 것을 알 수 있다.
이 차이가 크게 느껴지지 않지만 이 매크로가 어떤 특정 테스트를 수행하는데 사용된다면,
그 테스트가 언어를 검증하는데 사용된다면 다음과 같은 예측을 할 수 있다.
한 언어당 800개의 문자열이 있다. 그리고 언어의 종류는 23개라고 할 때,
spliBadExample 서브루틴만을 사용하는데 걸리는 시간은 0.01 x 800 x 23
'# Study > VBA' 카테고리의 다른 글
Convert string to Unicode (0) | 2016.12.27 |
---|---|
엑셀 2003 개발도구 탭 추가하기 (0) | 2016.12.26 |