VBAFor문 vs For Each문 무엇이 더 빠를까??

2023-01-28

VBA 공부하는 단톡방에서 아래와 같은 질문이 있었습니다.



저는 개인적으로 1번이 더 빠를거라고 생각했지만,

과연 정말 그럴지, 그렇다면 얼마나 더 빠른지 궁금했습니다.


그래서 바로 실험을 해보았습니다.


1. For Each 문을 사용하여 배열 각 요소에 접근하여 얼마나 걸리는지 계산하는 함수 만들기


2. For 문을 사용하여 1번과 동일한 함수 만들기


3. 여러차례 실험을 통해 평균 결과 내보기



코드는 아래와 같습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
 
Function 포이치문걸리는시간(db)
    
    t1 = Timer
    
    For Each Data In db
        임시변수 = Data
    Next
    
    t2 = Timer
    
    포이치문걸리는시간 = t2 - t1
    
End Function
 
Function 포문걸리는시간(db)
 
    t1 = Timer
    
    For i = 1 To UBound(db)
        임시변수 = db(i)
    Next
    
    t2 = Timer
    
    포문걸리는시간 = t2 - t1
    
End Function
 
 
Sub 테스트()
 
    ReDim db(1 To 100000000) '1억개
    
    For i = 1 To 10
        행 = 5 + i
        Cells(행, "B").Value = 포이치문걸리는시간(db)
        Cells(행, "C").Value = 포문걸리는시간(db)
    Next
        
End Sub
 
cs



실험 결과는 아래와 같았습니다.


실행횟수포이치문(A)포문(B)A/B
1                1.742                1.90691%
2                1.594                1.91483%
3                1.602                1.93083%
4                1.641                1.94584%
5                1.641                1.98483%
6                1.656                1.99283%
7                1.695                1.98485%
8                1.664                2.00883%
9                1.656                1.99283%
10                1.641                2.00882%
평균1.6531.96684%


For Each 문이 For문에 비해 16% 빠른 결과를 보여줬습니다.


물론 한가지 환경에서만 실험되었기 때문에

배열의 특성, 데이터 종류, 배열 요소에 접근하는 방법 등

여러가지 사용환경이 달라지면 실험결과가 다를 수도 있기 때문에

For Each가 항상 16% 빠른 것을 보장하는 실험은 아닙니다.


사실 VBA는 1억개의 배열을 사용할 일이 잘 없고

대부분 수백,수천 정말 많아야 수만,수십만개의 데이터를 다루는 정도에 그칩니다.

현재 엑셀 시트가 지원하는 행의 개수가 약 100만개정도이기 때문이죠

(정확히는 1048576개) 과거에는 65536개였는데

CPU 성능 및 메모리 향상으로 인해 약 100만개로 늘어난 만큼

향후에는 수천만행, 수억행까지 처리할 수 있는 엑셀이 되지 않을까 생각합니다.


결론.

For Each 가 좀 더 빠르지만 1억회를 반복해야 0.3초 빨랐으니

1억회를 반복하는 업무를 하거나 0.3초가 엄청 중요하지 않는 이상

이런거 따지기보다 하나라도 더 자동화하자. 

끗.