게임강의

[Basic]VB Tip(비쥬얼 베이직 팁)

컨텐츠 정보

본문


6.0] 비주얼 베이직 프로그램 속도 향상 팁 모음.



 비주얼 베이직은 변수형의 변환이 자유롭고, 편리한 언어입니다. 그렇기 때문에 생산성이 높은 언어로



 높은 평가를 받고 있는 언어중 하나입니다. 그런데, 이런 특징때문에 코딩을 자칫 잘못하면 같은 결과이지만



 속도가 현저하게 느려지는 일이 발생할 수 있습니다. 이런 일들의 대표적인 예들을 짚어드리기 위해 이 글을



 썼습니다.



 (1) 특별한 목적이 아니라면 Variant형은 쓰지 말자.



 비주얼 베이직은 기본적으로 Variant라는 변수형을 제공합니다. 이는 Visual Basic이 OLE(Object Linking/Embedding) 자동화 체계로 구현되었음을 말해주는 단서이기도 한데요. 이 변수형을 쓰면 실제 연산 속도가 느려지는 일이 발생하게 됩니다. Variant 형은 내부적으로 아래와 같은 구조체로 표현됩니다.



Private Type VARIANT

    vt As Integer ' 변수형 상수 (vbString, vbArray, ...의 혼합)

    wReserved1 As Integer ' 예약(미래를 위해 사용하지 않는 공간)

    wReserved2 As Integer ' 예약(미래를 위해 사용하지 않는 공간)

    wReserved3 As Integer ' 예약(미래를 위해 사용하지 않는 공간)

    Data As ... ' 실제 데이터

End Type



위와 같이 변수형 정보를 직접적으로 담고 있기 때문에, 접근을 할 때마다 변수형에 대한 체크를 하기 때문에



속도가 느려지게 됩니다. 이런 속도 차이는 다음과 같은 코드로 확인이 가능합니다.

 



 Dim v1 As Variant, v2 As Double, sStart As Single, i As Long


    v1 = 0: v2 = 0


    sStart = Timer

    For i = 0 To 1000000

        v1 = v1 + i

    Next


    Debug.Print "Variant = " & Timer - sStart & vbCrLf


    sStart = Timer

    For i = 0 To 1000000

        v2 = v2 + i

    Next


    Debug.Print "Double = " & Timer - sStart & vbCrLf



--- 실행 결과 ---



 



Variant = 3.099121E-02 ' 약 0.03

Double = 1.598535E-02 ' 약 0.015

Variant = 3.201001E-02 ' 약 0.032

Double = 1.499707E-02 ' 약 0.0149

Variant = 3.098535E-02 ' 약 0.03

Double = 1.601001E-02 ' 약 0.016



* 위와 같이 거의 절반의 속도가 줄어듬을 알 수 있습니다.



  아주 작은 작업이라면 거의 차이가 없을 수 있지만, 반복적인 대량 작업의 경우 전체적인 성능에 큰 영향을 주게 됩니다. 특별한 경우가 아니라면 Variant형을 쓰지 맙시다!



그렇다면 Variant형을 쓰게 될 때는 언제일까요?



'변수의 이름으로 변수의 값을 읽거나 쓰고싶다' 라는 것을 달성할때는 Variant형을 이용해서 직접 변수 관리



 체제를 만들어 줄 수 밖에 없습니다. 이런 변수 관리 체제는 아래와 같은 방식으로 만들어줄 수 있습니다.



Private Type VariableType

    VarName As String     ' 변수명을 여기에 저장!

    VarValue As Variant   ' 값을 저장한다.

End Type


Private Variables() As VariableType


Private Function CheckArrayIsImplemented() As Boolean

    On Local Error GoTo NotImplemented

    Dim Temp As Long

    Temp = UBound(Variables)

    CheckArrayIsImplemented = True

NotImplemented:

End Function


Sub SetVariable(ByVal VarName As String, ByVal VarValue As Variant)

    ' 변수를 설정한다.

    ' "A" = "B" --> Call SetVariable("A", "B")


    ' 배열의 크기를 1 확장한다.

    If Not CheckArrayIsImplemented Then

        ReDim Variables(0)

    Else

        ReDim Preserve Variables(UBound(Variables) + 1)

    End If


    ' 변수를 새로 넣어준다.

    With Variables(UBound(Variables))

        .VarName = VarName

        .VarValue = VarValue

    End With

End Sub


Function GetVariable(ByVal VarName As String) As Variant

    Dim i As Long

    If Not CheckArrayIsImplemented Then Exit Function

    For i = 0 To UBound(Variables)

        If Variables(i).VarName = VarName Then

            GetVariable = Variables(i).VarValue

        End If

    Next

End Function



대충 위와 같은 방법으로 변수 목록을 임의적으로(자체적으로) 하나 더 만들어서 변수처럼



사용할 수 있을것입니다. 참고만 하세요.


 



Variant 형의 속도가 느리기 때문에, 주요 VBA 함수도 사용을 달리해야 속도 향상을 맛보실 수 있습니다.



String 조작 함수 (Mid, Left, Right, ...)등은 함수이름 뒤에 $를 붙이면 반환값이 String임을 명시할 수 있으므로,



더욱 빠른 처리가 가능해집니다.



ex) 느린 처리: Mid(A, 10, 2) ----> 빠른 처리: Mid$(A, 10, 2)



 (2) 배열 복사는 For문으로 하지 말자.



배열을 복사하기 위해 초보자들은 아래와 같은 코드를 작성하기도 합니다.



Dim Array1(20) As Long, Array2(20) As Long, i As Long

For i = 0 To 20

    Array1(i) = Array2(i)

Next 



비주얼 베이직은 배열 복사를 기본적으로 지원합니다. For문으로 하는 것은 뻘짓이라고 할 수 있습니다.



Visual Basic에서는 아래와 같이 배열 복사를 할 수 있습니다. 



Dim Array1() As Long, Array2(20) As Long

    Array1() = Array2()





의외로 간단하지 않습니까? 하지만, 속도 차이는 엄청나다는 것을 잊지 마십시요.



 (3) If 문과 Iif 함수 / Select Case 문과 Switch 함수는 비슷하지만, 처리 속도는 천지차이입니다.



 IF문은 '문' 이고, Iif는 '함수'입니다. 마찬가지로 Select Case/Switch 역시 비슷한 맥락에서 볼 수 있는데요.



 문과 함수는 명백히 다릅니다. 처리 속도는 그야말로 엄청난 차이를 보입니다. 게다가 Iif/Switch는 VBA 함수여서



 Variant 변수형을 이용해서 정보를 전달하는데, 이 것도 속도 저하의 한 작용을 합니다.



 (4) 간단한 작업은 반복문보다는 직접 노가다하는것이 더 빠릅니다.



 쉽게 말해,



Dim i As Long



 For i = 1 To 3



 Print "HAHA"



 Next 는



 Print "HAHA"



 Print "HAHA"



 Print "HAHA"



  보다 느립니다.



 



출처 : http://gofox.tistory.com/23


관련자료

댓글 0
등록된 댓글이 없습니다.

최근글


새댓글


  • 등록자 벼배릅 등록일 04.14
알림 0