[C#] Linq 성능 테스트

natae·2022년 9월 9일
0

Csharp

목록 보기
7/9

업데이트

  • 221003
    • Where, Query 방식의 경우, 조건문을 즉시 계산하지 않는 것으로 보임(Lazy evaluation)
    • 그래서 ToList()로 조건문까지 반영된 버전으로 코드 및 출력 업데이트

개요

  • Linq 클래스의 Where, Find 등 함수에 람다식을 파라미터로 전달하여 특정 데이터를 탐색 할 수 있음
  • Linq 없이 for, foreach로 탐색하는 경우와 성능 차이 확인

코드

Linq.cs

namespace Study
{
    public class Linq
    {
        public void PerformanceCheck(int listCount, int iterCount)
        {
            var rand = new Random();
            var stopWatch = new Stopwatch();

            stopWatch.Start();
            for (var i = 0; i < iterCount; i++)
            {
                var originList = GetRandList(rand, listCount);

                var foreachList = Where(originList);
            }
            stopWatch.Stop();
            Console.WriteLine($"foreach\t {stopWatch.ElapsedTicks} ticks\t {stopWatch.ElapsedMilliseconds} ms");

            stopWatch.Restart();
            for (var i = 0; i < iterCount; i++)
            {
                var originList = GetRandList(rand, listCount);

                var whereList = originList.Where((integer) => integer < 50).ToList();
            }
            stopWatch.Stop();
            Console.WriteLine($"Where\t {stopWatch.ElapsedTicks} ticks\t {stopWatch.ElapsedMilliseconds} ms");

            stopWatch.Restart();
            for (var i = 0; i < iterCount; i++)
            {
                var originList = GetRandList(rand, listCount);

                var findAllList = originList.FindAll((integer) => integer < 50);
            }
            stopWatch.Stop();
            Console.WriteLine($"FindAll\t {stopWatch.ElapsedTicks} ticks\t {stopWatch.ElapsedMilliseconds} ms");

            stopWatch.Restart();
            for (var i = 0; i < iterCount; i++)
            {
                var originList = GetRandList(rand, listCount);

                var queryList = (from integer in originList where integer < 50 select integer).ToList();
            }
            stopWatch.Stop();
            Console.WriteLine($"Query\t {stopWatch.ElapsedTicks} ticks\t {stopWatch.ElapsedMilliseconds} ms");

            Console.WriteLine("------------------------------------------");
        }

        private List<int> Where(List<int> list)
        {
            var newList = new List<int>();
            foreach(var integer in list)
            {
                if (integer < 50)
                {
                    newList.Add(integer);
                }
            }
            return newList;
        }

        private List<int> GetRandList(Random rand, int listCount)
        {
            var originList = new List<int>();
            for (var j = 0; j < listCount; j++)
            {
                originList.Add(rand.Next(100));
            }

            return originList;
        }
    }
}

Program.cs

// See https://aka.ms/new-console-template for more information
using Study;

var linq = new Linq();
linq.PerformanceCheck(1000, 1);
linq.PerformanceCheck(1000, 100);
linq.PerformanceCheck(1000000, 1);
linq.PerformanceCheck(1000000, 100);

출력

foreach  2961 ticks      0 ms
Where    17856 ticks     1 ms
FindAll  727 ticks       0 ms
Query    823 ticks       0 ms
------------------------------------------
foreach  86169 ticks     8 ms
Where    42490 ticks     4 ms
FindAll  25321 ticks     2 ms
Query    24212 ticks     2 ms
------------------------------------------
foreach  369114 ticks    36 ms
Where    240216 ticks    24 ms
FindAll  221559 ticks    22 ms
Query    208577 ticks    20 ms
------------------------------------------
foreach  26781427 ticks  2678 ms
Where    20116095 ticks  2011 ms
FindAll  20595098 ticks  2059 ms
Query    20149819 ticks  2014 ms
------------------------------------------z

결론

  • 데이터 수 및 반복 횟수가 적을 경우
    • FindAll = Query > foreach > Where
  • 데이터 수 및 반복 횟수가 많을 경우
    • Query = Where > FindAll > foreach
profile
서버 프로그래머

0개의 댓글