리루

VBA Function(or Subroutine) 수행시간 측정 & Array 리턴 함수의 잘못된 사용 본문

# Study/VBA

VBA Function(or Subroutine) 수행시간 측정 & Array 리턴 함수의 잘못된 사용

뚱보리루 2016. 12. 28. 22:35

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