foreach 구문 처리 속도가 점점 느려집니다.

.NET Framework 4.7.2에서 간단하게 테스트 코드를 작성한 후 증상을 확인하였습니다.

using System;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp2
{
    internal class Program
    {
        static void Main(string[] args)
        {
            var sw = Stopwatch.StartNew();
            DataTable dt = null;
            for (var i = 0; i < 1000; i++)
            {
                dt = MakeTempDataTable(dt);
                Console.WriteLine(sw.Elapsed);
                sw.Restart();
            }
        }

        static DataTable MakeTempDataTable(DataTable dt)
        {
            if (dt is null)
                dt = new DataTable("Temp Table");
            else
            {
                //dt.Rows.Clear();
                //dt.Columns.Clear();

                dt = new DataTable("Temp Table");
            }

            for (var columns = 0; columns < 1000; columns++)
                dt.Columns.Add(new DataColumn($"{columns}1"));

            for (var row = 0; row < 10000; row++)
            {
                var newRow = dt.NewRow();

                for (var columns = 0; columns < 1000; columns++)
                {
                    newRow[columns] = columns;
                }
            }

            return dt;
        }
    }
}

dt.Rows.Clear()dt.Columns.Clear()를 하더라도 DataTable 인스턴스가 가지고 있는 메모리 자원이 GC이후에도 해제되지 않고 계속 증가하는 것을 확인할 수 있었습니다.

DataTable 인스턴스를 새로 만들어서 사용했을 경우 그런 문제가 없었습니다.

결론은, @nyjin님이 제안한 것처럼 그냥 DataTable의 인스턴스를 새로 만들어서 사용해보세요.

8개의 좋아요