반응형
근래에 업무를 진행하면서 계산 속도가 이슈가 되는 일이 많았다. 그래서 최적화 할떄 마다 하나씩 정리하고자 한다.
C#을 쓰는 유저들은 잘 아는것처럼 LINQ는 사용하기 너무 편하지만 성능은 메뉴얼 구현보다 느리다는것은 잘 알려진 펙트이다. 이점을 해보고자 한다.
LINQ에서 자주 쓰는 Where 구문에 대해 테스트를 하기 위해 아래와 같은 코드를 작성하였다.
static void Main(string[] args)
{
List<int> source = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Restart();
for (int i = 0; i < 1000_000; i++)
{
var result = LinqWhereTest(source, 1);
}
sw.Stop();
Console.WriteLine($"LinqWhereTest => \t{sw.ElapsedMilliseconds} ms");
sw.Restart();
for (int i = 0; i < 1000_000; i++)
{
var result = LinqFindAllTest(source, 1);
}
sw.Stop();
Console.WriteLine($"LinqFindAllTest => \t{sw.ElapsedMilliseconds} ms");
sw.Restart();
for (int i = 0; i < 1000_000; i++)
{
var result = ForeachLoopTest(source, 1);
}
sw.Stop();
Console.WriteLine($"ForeachLoopTest => \t{sw.ElapsedMilliseconds} ms");
sw.Restart();
for (int i = 0; i < 1000_000; i++)
{
var result = ForLoopTest(source, 1);
}
sw.Stop();
Console.WriteLine($"ForLoopTest => \t{sw.ElapsedMilliseconds} ms");
Console.ReadKey();
}
static List<int> LinqWhereTest(List<int> src, int t)
{
return src.Where(m => m > t).ToList();
}
static List<int> ForLoopTest(List<int> src, int t)
{
List<int> result = new List<int>();
for (int i = 0; i < src.Count; i++)
{
if (src[i] > t)
{
result.Add(src[i]);
}
}
return result;
}
static List<int> ForeachLoopTest(List<int> src, int t)
{
List<int> result = new List<int>();
foreach (var item in src)
{
if (item > t)
{
result.Add(item);
}
}
return result;
}
static List<int> LinqFindAllTest(List<int> src, int t)
{
return src.FindAll(m => m > t).ToList();
}
총 4가지의 where, FindAll, 메뉴얼 구현 For, 메뉴얼 구현 Foreach이다.
결과는 다음과 같다.
오차가 있다고 가정한다면 For와 Foreach는 비슷하다고 하고, Where문과 메뉴얼 구현을 보면 약 2배정도의 성능차이를 보인다. 그리고 또한 FindAll도 Where에 비해 높은 성능을 보이는 것을 확인 할 수 있었다.
반응형
'프로그래밍 > C#' 카테고리의 다른 글
[C#] Eager & Short-circuit operators (0) | 2022.02.25 |
---|---|
[C#] 배열 복사 성능 평가 (0) | 2022.02.08 |
[C#] List에 추가된 구조체의 값 (0) | 2022.01.25 |
[C#] Newtonsoft Json 상속 대상까지 Serialize하기 (0) | 2022.01.18 |
[C#] Newtonsoft private set 값 DeserialzeObject 방법 (0) | 2022.01.18 |