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