프로그래밍/C#

[C#] Linq Where Performance Test

흔한티벳여우 2022. 1. 26. 10:30
반응형

근래에 업무를 진행하면서 계산 속도가 이슈가 되는 일이 많았다. 그래서 최적화 할떄 마다 하나씩 정리하고자 한다.

 

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에 비해 높은 성능을 보이는 것을 확인 할 수 있었다.

반응형