이전에 봤던 책에서 C++ 의 최적화가 얼마나 중요한지 짚고 넘어갔었다.
최근 다중 Thread 내의 여러가지 for 문이 동시에 돌아가는 구문이 있었는데
바꾼 코드가 조금 지연이 발생하여 원인을 찾던 중, C# 에서도 캐싱이 적용되는지 확인하기 위해
간단하게 테스트 해 보았다.
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
int sum = 0;
List<int> v_a = new List<int>();
for (int i = 0; i < 40000000; ++i)
{
v_a.Add(i);
}
// normal type for
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for(int i =0; i < v_a.Count; ++i)
{
sum += v_a[i];
}
stopwatch.Stop();
Console.WriteLine("1 : " + stopwatch.ElapsedMilliseconds);
stopwatch.Reset();
sum = 0;
// foreach type for
stopwatch.Start();
foreach (var i in v_a)
{
sum += i;
}
stopwatch.Stop();
Console.WriteLine("2 : " + stopwatch.ElapsedMilliseconds);
stopwatch.Reset();
sum = 0;
// predeclear type for
stopwatch.Start();
for ( int i =0, count = v_a.Count; i < count; ++i)
{
sum += v_a[i];
}
stopwatch.Stop();
Console.WriteLine("2 : " + stopwatch.ElapsedMilliseconds);
}
}
}
결론적으로
Normal 한 for 문은 제일 느리고,
for each 는 값 복사로 인해 조금 느려지지만 그래도 Normal 대비 20% 빠르고,
Caching for 문은 Normal 대비 30%, foreach 대비 5~10% 가량 빨랏다.
C# 에서는 garbage collection 의 마법같은 메모리 관리로 인해
크게 최적화, 메모리 관리에 신경을 쓰지 않는경우가 많았지만.
C++ 에서 배워둔 각종 최적화 기법은 여전히 유용하다.
물론 위의 for 문은 극단적으로 단순하기에 저정도 차이가 벌어지는 것이고
평균적으론 1% 미만의 미세한 차이가 발생할 것이다.
하지만 엔지니어로써 이러한 캐싱기법을 알고 있다면
0.1%의 속도라도 끌어올리기 위해 캐싱 for 를 사용하는것을 권장한다.
※ 만약 상수 count() 를 불러오는 함수식이 생각보다 복잡하다면, 실제로도 10% 이상의 차이가 발생할수도 있다.
'Programming > C#' 카테고리의 다른 글
[C#] UDP Multicast 수신 (0) | 2022.04.08 |
---|---|
[C#]System.Timers.Timer 사용시 Race Condition (0) | 2021.12.22 |
[C#] Task .Wait() vs await 차이점 (0) | 2021.05.04 |
[C#] StructLayoutAttribute.Pack 필드 설명 (0) | 2021.04.28 |
[C#] Struct 마샬링 및 사용법 (0) | 2021.04.15 |