WinForms용 FlexGrid의 .NET 8 DataGrid 성능 벤치마크
페이지 정보
작성자 MESCIUS 작성일 2024-05-07 16:03 조회 43회 댓글 1건본문
첨부파일
관련링크
빠른 시작 가이드 | |
필요한 항목 | Visual Studio 2022, ComponentOne WinForms Edition, BenchmarkDotNet + |
참조 컨트롤 | WinForms용 FlexGrid + |
자습서 개념 | .NET 8 WinForms DataGrid 성능 - WinForms 응용 프로그램의 .NET 버전 6과 8에서 FlexGrid, .NET DataGrid 컨트롤의 성능 차이를 보여 줍니다. |
.NET 8은 이전 버전과 유사한 JIT(Just In Time) 컴파일러를 사용하지만, 코드를 더 빠르게 처리하고 프로세스 실행 시간이 역시 더욱 짧습니다.
메모리 제한을 동적으로 조정할 수 있게 함으로써 가비지 수집기 성능 역시 향상되었습니다. 이는 수요에 따라 리소스 규모를 조정해야 하는 클라우드 솔루션에 가장 유용합니다.
.NET 응용 프로그램을 업그레이드해야 하는 가장 큰 이유는 일반적으로 성능이지만, Microsoft는 .NET의 각 버전의 성능을 제한하고 있습니다.
이것이 .NET 플랫폼으로 마이그레이션해야 하는 가장 큰 이유입니다.
.NET 8에서 성능을 측정하는 방법
널리 사용되는 도구는 .NET 코드의 성능을 간단히 측정할 수 있습니다.
시간과 메모리 할당을 측정할 뿐만 아니라, 다양한 벤치마크 테스트와 함께 .NET의 여러 버전을 비교할 수도 있습니다. 또한 행과 열의 수와 같은 매개 변수도 사용할 수 있습니다. 단일 보고서로 모든 결과를 실행하고 출력합니다.
이전 블로그인 에서 BenchmarkDotNet을 구성하는 방법에 대해 더 자세히 알아볼 수 있습니다.
아래의 경우, .NET 8과 비교해 WinForms .NET 6용 FlexGrid를 테스트합니다. 이 둘은 모두 장기 지원 버전으로, 20개의 열과 행의 범위가 10,000에서 100만인 데이터를 생성하는 것을 테스트 해보겠습니다.
이제 아래에서 결과를 함께 확인해 보겠습니다!
.NET 8용 FlexGrid 벤치마크 결과
FlexGrid는 메시어스의 강력한 교체 플랫폼 .NET DataGrid로, WinForms, WPF, WinUI, UWP, Xamarin, Core, 그리고 심지어 MAUI에서도 지원됩니다.
WinForms FlexGrid에 대해 다음 벤치마크가 수행됩니다.
DataGrid 칠하기
DataGrid에 데이터 할당
열 필터링
열 정렬
열 그룹화
열 크기 자동 조정
벤치마크: DataGrid 그리기
그리기 벤치마크는 컨트롤을 그리는 데 사용하는 시간과 메모리를 측정합니다.
이는 Refresh 메서드로 호출할 수 있습니다.
_flexGrid.Refresh();
결과:
행수 |
평균 시간(ms) |
할당된 메모리(KB) |
||
|
.NET 6 |
.NET 8 |
.NET 6 |
.NET 8 |
10,000 |
84.555 |
82.025 |
359.77 |
363.96 |
100,000 |
91.157 |
82.288 |
359.77 |
363.96 |
1,000,000 |
80.506 |
77.072 |
359.77 |
363.96 |
할당된 그리기 시간과 메모리는 .NET 버전이나 행 수와 상관없이 거의 동일합니다. 이는 DataGrid는 표시 가능한 행만 그리기 때문입니다.
데이터 그리드를 단순히 그리는 것에서 .NET 8 버전은 단지 3~10% 빠릅니다.
벤치마크: DataGrid에 데이터 할당
이 벤치마크는 데이터 소스와 데이터가 매핑된 열을 설정합니다.
데이터는 벤치마크 테스트의 외부에 생성됩니다.
_flexGrid.DataSource = _data.DataTable; _flexGrid.Cols[columnIndex].DataMap = _data.DataMaps[dataMapIndex];
결과:
행수 | 평균 시간(ms) | 할당된 메모리(KB) | ||
| .NET 6 | .NET 8 | .NET 6 | .NET 8 |
10,000 | 11.945 | 12.096 | 1583.77 | 1583.7 |
100,000 | 63.697 | 55.059 | 14943.13 | 14943.09 |
1,000,000 | 604.41 | 590.135 | 148537.49 | 148537.24 |
더 큰 데이터 소스를 할당하는 데 더 많은 메모리와 시간이 사용되었지만, .NET 6과 .NET 8간 그다지 차이가 없습니다.
데이터 할당에 있어서 .NET 8 버전은 단지 2~13% 빠릅니다.
벤치마크: 열 필터링
필터링 벤치마크는 다음 테스트 코드를 사용해 두 개의 조건부 필터를 생성하고 적용합니다.
_flexGrid.AllowFiltering = true; ConditionFilter conditionFilter = (_flexGrid.Cols[_flexGrid.Cols.Fixed].Filter as ColumnFilter).ConditionFilter; Condition condition1 = conditionFilter.Condition1; condition1.Operator = ConditionOperator.GreaterThan; condition1.Parameter = _condition1Parameter; Condition condition2 = conditionFilter.Condition2; condition2.Operator = ConditionOperator.LessThan; condition2.Parameter = _condition2Parameter; _flexGrid.ApplyFilters();
결과:
행수 | 평균 시간(ms) | 할당된 메모리(KB) | ||
| .NET 6 | .NET 8 | .NET 6 | .NET 8 |
10,000 | 20.476 | 17.45 | 939 | 939.02 |
100,000 | 167.649 | 118.522 | 9376.5 | 9376.52 |
1,000,000 | 1356.267 | 1066.629 | 93751.5 | 93751.52 |
열 필터링에 있어서 .NET 8 버전이 15~21% 더 빠른 것을 확인해 보세요!
벤치마크: 열 정렬
정렬 벤치마크는 FlexGrid의 정렬 메서드를 사용하여 단일 열을 정렬합니다.
_flexGrid.Sort(SortFlags.Ascending, 1);
결과:
행수 | 평균 시간(ms) | 할당된 메모리(KB) | ||
| .NET 6 | .NET 8 | .NET 6 | .NET 8 |
10,000 | 10.755 | 9.566 | 614.41 | 614.23 |
100,000 | 166.266 | 159.876 | 6144.84 | 6144.66 |
1,000,000 | 2959.98 | 2968.626 | 63296 | 63295.82 |
백만 행의 경우 .NET 6과 .NET 8간 극적인 개선은 없습니다.
하지만, .NET 8 버전은 중소형 데이터 소스의 경우 4~11% 더 빠릅니다.
벤치마크: 열 그룹화
그룹화 벤치마크는 그룹 설명자를 FlexGrid에 추가하여 단일 열을 그룹화합니다.
_flexGrid.GroupDescriptions = new List<GroupDescription>() { new GroupDescription(_flexGrid.Cols[_firstDataMapColumnIndex].Name, ListSortDirection.Ascending) };
결과:
행수 | 평균 시간(ms) | 할당된 메모리(KB) | ||
| .NET 6 | .NET 8 | .NET 6 | .NET 8 |
10,000 | 89. | 9.566 | 1935.67 | 1935.59 |
100,000 | 166.266 | 779.149 | 13091.7 | 13091.39 |
1,000,000 | 2959.98 | 8577.146 | 126493.31 | 126493.23 |
데이터 소스가 클수록, .NET 8에서 더 많은 시간을 확보할 수 있습니다.
하지만, 더 작은 데이터 집합의 경우, 성능 향상의 비율이 더 높습니다. (100만 행의 경우 18%, 1만 행의 경우 31%)
벤치마크: 열 크기 자동 조정
내용에 맞도록 열의 크기를 자동으로 조정하는 것은 비싼 기능이지만, 때때로 성능 비용의 가치가 있습니다.
이 벤치마크는 서로 다른 열 개수에 대해 측정된 10,000개의 기본 행을 사용합니다.
_flexGrid.AutoSizeCols();
결과:
행수 | 평균 시간(ms) | 할당된 메모리(KB) | ||
| .NET 6 | .NET 8 | .NET 6 | .NET 8 |
20 | 1033.5 | 871.4 | 135.34 | 130.76 |
50 | 2508 | 2251.1 | 333.09 | 322.03 |
100 | 5226.4 | 4400 | 663.41 | 641.67 |
200 | 10682.3 | 8574.7 | 1327.88 | 1284.39 |
.NET 8 버전이 모든 데이터 원본 크기에 대해 해당 작업을 더 빠르게 수행하고, 더 나은 메모리 할당을 제공하는 것을 확인해 보세요!
열 크기 자동 조정에서 .NET8은 약 15~20% 개선됩니다.
.NET 8 벤치마크 결론
메모리 할당은 .NET 6과 .NET 8 간 서로 비슷하지만, 이 벤치마크는 .NET 8이 다양한 DataGrid 작업을 수행하는 데에 더 빠른 실행 시간이 제공합니다.
DataGrid를 그리는 것은 3~10% 더 빠름
데이터 할당은 2~13% 더 빠름
열 필터링은 15~21% 더 빠름
열 정렬은 4~11% 더 빠름
열 그룹화는 18~31% 더 빠름
열 자동 크기 조정은 15~20% 더 빠름
전반적으로 .NET 8은 사용하는 기능과 데이터 소스의 크기에 따라 .NET 6보다 2~31% 더 빠릅니다.
벤치마크를 직접 테스트하는 방법
직접 벤치마크를 테스트하려면 .
실행하는 데 오랜 시간이 소요될 수 있으므로, 실행 전에 다을 따르는 것이 좋습니다.
첨부된 샘플을 개발자 명령 프롬프트에서 다음 명령을 사용하여 실행할 수 있습니다.
dotnet run -c Release -f net6.0-windows --project FlexGridBenchmark8 --runtimes net6.0-windows net8.0-windows --filter **
또한, 명령으로 실행할 테스트를 미세 조정하거나, 벤치마크 폴더에서 다양한 클래스 파일을 제외하여 실행할 테스트를 조절할 수 있습니다!
지금 바로 ComponentOne을 다운로드하여 직접 테스트해보세요!