C# 에서 "For문이 Foreach 보다 좋다"라고 막연하게 알고 있었는데 많은 사람들이 Foreach문을 사용하는 것을 볼 수 있었다. 이에 의심을 갖고 직접 테스트를 해보기로 했다.
연산 속도
테스트 코드
class Tester { static int ForWithArray(int[] array) { int t = 0; for (int i = 0; i < array.Length; i++) t += array[i]; return t; } static int ForeachWithArray(int[] array) { int t = 0; foreach (var v in array) t += v; return t; } static int ForWithList(Listlist) { int t = 0; for (int i = 0; i < list.Count; i++) t += list[i]; return t; } static int ForeachWithList(List list) { int t = 0; foreach (var v in list) t += v; return t; } ... }
테스트 환경
OS Windows 10 x64
Visual Studio C# 2015
.NET ?
측정 단위 : ms
1. Single 테스트 / Array Size : 100000000
Debug
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
For-Array | 216 | 217 | 214 | 210 | 216 | 214 | 213 | 224 | 217 | 213 |
Foreach-Array | 230 | 231 | 237 | 232 | 238 | 234 | 233 | 222 | 229 | 239 |
For-List | 581 | 577 | 579 | 571 | 564 | 576 | 570 | 567 | 572 | 583 |
Foreach-List | 451 | 447 | 458 | 457 | 448 | 452 | 461 | 456 | 457 | 454 |
Release
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
For-Array | 52 | 41 | 54 | 50 | 42 | 43 | 40 | 54 | 40 | 42 |
Foreach-Array | 41 | 47 | 53 | 46 | 44 | 51 | 44 | 45 | 42 | 44 |
For-List | 64 | 64 | 61 | 63 | 66 | 62 | 70 | 64 | 68 | 65 |
Foreach-List | 346 | 277 | 270 | 281 | 278 | 276 | 273 | 267 | 271 | 277 |
100,000,000의 크기를 가진 배열을 1회 탐색한 결과 이다.
Release 평균 / For-Array 45.8 / Foreach-Array 45.7 / For-List 64.7 / Foreach-List 281.6
배열 이용 시 큰 차이는 없으나 List 이용 시 4배 이상의 차이가 난다.
2. Loop 테스트/ Array Size : 1000000 / Loop Time : 1000
Debug
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
For-Array | 2298 | 2272 | 2385 | 2327 | 2308 | 2357 | 2407 | 2326 | 2331 | 2390 |
Foreach-Array | 2368 | 2311 | 2395 | 2368 | 2363 | 2391 | 2355 | 2354 | 2359 | 2421 |
For-List | 5644 | 5637 | 5621 | 5660 | 5639 | 5656 | 5646 | 5643 | 5627 | 5777 |
Foreach-List | 4492 | 4457 | 4473 | 4430 | 4464 | 4472 | 4452 | 4452 | 4456 | 4508 |
Release
| 1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
For-Array | 644 |
606 |
543 |
680 |
696 |
576 |
670 |
722 |
585 |
598 |
Foreach-Array | 817 |
739 |
707 |
763 |
837 |
780 |
733 |
724 |
710 |
794 |
For-List | 690 |
675 |
690 |
684 |
681 |
702 |
665 |
673 |
669 |
687 |
Foreach-List | 2822 |
2806 |
2813 |
2838 |
2807 |
2770 |
2746 |
2841 |
2844 |
2807 |
1,000,000의 크기를 가진 배열을 1000번 탐색하였다.
위와 비슷하게 배열 이용 시 Single 일 때보다 조금 더 차이가 나고, List 이용 시 4배 이상의 차이가 난다.
결론
성능이 중요한 경우 List 보다는 Array, Foreach문 보단 For문을 사용하자.
참고
'Works > C#' 카테고리의 다른 글
Covariance and Contravariance (0) | 2022.01.19 |
---|---|
C# 암호화 변수 (0) | 2020.09.23 |
[.NET] Windows Registry 등록/삭제 (0) | 2019.09.08 |
[.NET] Java Bridge (2) | 2019.03.22 |
댓글