For문 vs For Each문 무엇이 더 빠를까??
VBA 공부하는 단톡방에서 아래와 같은 질문이 있었습니다. 저는 개인적으로 1번이 더 빠를거라고 생각했지만, 과연 정말 그럴지, 그렇다면 얼마나 더 빠른지 궁금했습니다. 그래서 바로 실험을 해보았습니다. 1. For Each 문을 사용하여 배열 각 요소에 접근하여 얼마

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

저는 개인적으로 1번이 더 빠를거라고 생각했지만,
과연 정말 그럴지, 그렇다면 얼마나 더 빠른지 궁금했습니다.
그래서 바로 실험을 해보았습니다.
For Each 문을 사용하여 배열 각 요소에 접근하여 얼마나 걸리는지 계산하는 함수 만들기
For 문을 사용하여 1번과 동일한 함수 만들기
여러차례 실험을 통해 평균 결과 내보기
코드는 아래와 같습니다.
| 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 Colored by Color Scripter | cs |
실험 결과는 아래와 같았습니다.
| 실행횟수 | 포이치문(A) | 포문(B) | A/B |
| 1 | 1.742 | 1.906 | 91% |
| 2 | 1.594 | 1.914 | 83% |
| 3 | 1.602 | 1.930 | 83% |
| 4 | 1.641 | 1.945 | 84% |
| 5 | 1.641 | 1.984 | 83% |
| 6 | 1.656 | 1.992 | 83% |
| 7 | 1.695 | 1.984 | 85% |
| 8 | 1.664 | 2.008 | 83% |
| 9 | 1.656 | 1.992 | 83% |
| 10 | 1.641 | 2.008 | 82% |
| 평균 | 1.653 | 1.966 | 84% |
For Each 문이 For문에 비해 16% 빠른 결과를 보여줬습니다.
물론 한가지 환경에서만 실험되었기 때문에
배열의 특성, 데이터 종류, 배열 요소에 접근하는 방법 등
여러가지 사용환경이 달라지면 실험결과가 다를 수도 있기 때문에
For Each가 항상 16% 빠른 것을 보장하는 실험은 아닙니다.
사실 VBA는 1억개의 배열을 사용할 일이 잘 없고
대부분 수백,수천 정말 많아야 수만,수십만개의 데이터를 다루는 정도에 그칩니다.
현재 엑셀 시트가 지원하는 행의 개수가 약 100만개정도이기 때문이죠
(정확히는 1048576개) 과거에는 65536개였는데
CPU 성능 및 메모리 향상으로 인해 약 100만개로 늘어난 만큼
향후에는 수천만행, 수억행까지 처리할 수 있는 엑셀이 되지 않을까 생각합니다.
결론.
For Each 가 좀 더 빠르지만 1억회를 반복해야 0.3초 빨랐으니
1억회를 반복하는 업무를 하거나 0.3초가 엄청 중요하지 않는 이상
이런거 따지기보다 하나라도 더 자동화하자.
끗.