.NET 5 성능 벤치마크 - WinForms용 FlexGrid > 시티즌 인사이트

본문 바로가기

시티즌 커뮤니티

시티즌 인사이트

IT&개발 정보 .NET 5 성능 벤치마크 - WinForms용 FlexGrid

페이지 정보

작성자 GrapeCity 작성일 21-08-13 15:18 조회 126회 댓글 0건

본문

지난 번에는 FlexGrid 컨트롤을 기반으로 하는 .NET 5 및 .NET Framework 4.5.2 WinForms 컨트롤 비교 방법론을 설명했습니다.


이번에는 서로 다른 공통 FlexGrid 작업 비교 결과를 공유합니다. 2021년 11월 9일에 릴리스되는 .NET 6에도 동일한 방법론을 적용할 수 있습니다.



벤치마크


테스트 메서드에 대한 몇 가지 설명 정보, 벤치마크 방법에 대한 원본 코드, 측정값, 밀도 그림 및 벤치마크 테스트를 위해 수집된 결과의 정보를 제공합니다. 벤치마크에 추가 설정이 포함된 경우 정보와 코드 조각이 제공됩니다.


모든 벤치마크의 원본 파일은 전체 응용프로그램과 함께 이 블로그 포스트 아카이브에 첨부되어 있습니다.


각 벤치마크 소스 파일에는 데이터 생성을 제외한 모든 작업이 포함되어 있어 다른 파일로 전환하지 않고도 진행 상황을 이해할 수 있습니다.



데이터를 생성 및 할당

첫 번째 벤치마크 메서드는 데이터 생성을 측정하여 FlexGrid – DataTable을 데이터 소스로 지정하고 특정 열에 대한 데이터 맵을 지정하는 것입니다.


이 벤치마크의 경우 데이터 준비 자체를 측정하기 때문에 GlobalSetup 및 GlobalCleanup 단계가 없습니다.

[Benchmark]
public void GenerateAndAssignData()
{
  _data = DataGenerator.Generate(RowCount, ColumnCount);
​
  _flexGrid.DataSource = _data.DataTable;
​
  int firstDataMapColumnIndex = _flexGrid.Cols.Fixed + _data.FirstDataMapColumnIndex;
  int flexGridColumnCount = _flexGrid.Cols.Count;
  int dataTypeCount = _data.DataTypeCount;
  int dataMapIndex = 0;
  for (int columnIndex = firstDataMapColumnIndex; columnIndex < flexGridColumnCount; columnIndex += dataTypeCount)
  {
      _flexGrid.Cols[columnIndex].DataMap = _data.DataMaps[dataMapIndex];
      dataMapIndex++;
  }
}


요약 표:

표1


10000행의 경우:

이미지1

100000행의 경우:

이미지2

1000000행의 경우:

이미지3

대부분의 경우 .NET Framework 4.5.2와 .NET 5 간에 1-3%의 차이가 있음을 알 수 있습니다.


가끔 .NET 5가 .NET 4.5.2보다 빠르거나 그 반대의 경우도 있습니다. 가장 무거운 벤치마크(행 1000000개, 열 200개)의 경우 .NET 5는 최대 11%의 성능이 향상됩니다.


또한 모든 경우에 .NET 5 버전은 0.7%-0.9% 더 적은 메모리를 할당했습니다. 가장 무거운 벤치마크의 경우에는 약 188MB입니다.



데이터 할당

실제 환경에서는 최종 응용 프로그램을 위한 데이터를 생성하는 개발자는 많지 않습니다. 데이터는 이미 일부 데이터베이스에 존재하며 개발자는 데이터 소스로 FlexGrid에 할당하기만 하면 됩니다.


테스트 메서드의 다음 부분은 이미 준비된 데이터 할당만 측정합니다.

[Benchmark]
public void AssignData()
{
  _flexGrid.DataSource = _data.DataTable;
​
  int firstDataMapColumnIndex = _flexGrid.Cols.Fixed + _data.FirstDataMapColumnIndex;
  int flexGridColumnCount = _flexGrid.Cols.Count;
  int dataTypeCount = _data.DataTypeCount;
  int dataMapIndex = 0;
  for (int columnIndex = firstDataMapColumnIndex; columnIndex < flexGridColumnCount; columnIndex += dataTypeCount)
  {
      _flexGrid.Cols[columnIndex].DataMap = _data.DataMaps[dataMapIndex];
      dataMapIndex++;
  }
}


요약 표:

표2


10000행의 경우:

이미지4

100000행의 경우:

이미지5

1000000행의 경우:

이미지6

현재 테스트에서 .NET 5 버전의 성능이 여러 경우에 대해 16% 증가했음을 알 수 있으며 .NET 5 버전이 .NET 프레임워크 4.5.2보다 느린 경우는 없습니다.


또한 .NET 5에 대해 최대 2.5%의 메모리 개선이 있습니다.



그리드 그리기

그리기(드로잉 또는 렌더링이라고도 함) 작업이 없으면 어떤 UI 컨트롤도 데이터를 표시할 수 없습니다. 다음 벤치마크는 전체 그리드를 그리는 데 걸리는 시간을 측정합니다.


이전에 새로 고침 메서드에 대해 언급했습니다. 문서에 따르면 이 메서드는 컨트롤이 클라이언트 영역을 무효화하고 즉시 다시 그립니다. 내부적으로 이러한 메서드는 자주 사용되지 않으며 무효화 메서드가 선호됩니다.


그러나 무효화와 달리 새로 고침 메서드는 동기식 그리기를 강제 실행하고 전체 그리드를 그리는 데 필요한 시간을 측정할 수 있도록 합니다.

[Benchmark]
public void PaintGrid()
{
  _flexGrid.Refresh();
}


요약 표:

표3


10000행의 경우:

이미지7

100000행의 경우:

이미지8

1000000행의 경우:

이미지9


매번 .NET 5 버전이 .NET Framework 4.5.2보다 빠릅니다. 성능 향상은 28%로, .NET 5 버전이 .NET Framework 버전보다 1.3배 더 빠른 그리기를 보여줍니다.


그리기는 UI 제어에 가장 많이 사용되는 작업으로 모든 사용자 작업 후에 발생합니다. 예: 그리드 – 데이터 할당, 스크롤, 필터링, 그룹화, 행/열/데이터 상호 작용, 때로는 마우스 이동 등의 작업을 수행. 이 성능 향상은 최종 사용자가 .NET Framework 4.5.2+ 응용 프로그램보다 .NET 5 FlexGrid 응용 프로그램에서 하나 이상의 작업 후 데이터를 더 빠르게 볼 수 있음을 의미합니다.


또한 .NET 5 FlexGrid의 그리기에는 .NET Framework 4.5.2보다 약 3배 적은 메모리가 필요합니다.



100행 스크롤


사용자가 다음으로 수행하는 공통 작업은 스크롤입니다.


스크롤 동작을 에뮬레이트하기 위해 FlexGrid의 ShowCell 메서드를 사용합니다. 행 및 열 매개 변수에 해당하는 스크롤 위치를 계산하고 값을 스크롤 위치로 설정합니다.

[Benchmark]
public void Scroll100Rows()
{
  _flexGrid.ShowCell(100, _flexGrid.Cols.Fixed);
}


요약 표:

표4


10000행의 경우:

이미지10

100000행의 경우:

이미지11

100000행의 경우:

이미지12


여기서 우리는 .NET 5 버전이 더 빠르거나 그 반대인 경우도 있음을 알 수 있습니다.


전체 작업이 약 0,0004406밀리초인 경우 그리기와 함께 .NET 5 FlexGrid의 스크롤링은 .NET 4.5.2보다 느리지는 않습니다.


요약 표에는 할당 데이터가 표시되지 않습니다. 스크롤 작업 중에 메모리 할당이 없는 것으로 해석될 수 있지만 이러한 처리가 잘못되었을 수 있습니다. Adam Sitnik의 블로그 게시물에 따르면 BenchmarkDotNet은 "매회 약 100KB가 할당됩니다"라고 밝힌 GCAllocationTick 이벤트를 사용합니다.


메모리 할당 정보가 없다는 것은 스크롤 작업이 100KB 미만의 메모리를 할당한다는 의미일 수 있습니다.



모든 행 스크롤

다음 벤치마크 테스트는 전체 그리드의 스크롤링을 측정합니다.

[Benchmark]
public void ScrollAllRows()
{
  _flexGrid.ShowCell(_flexGrid.Rows.Count - 1, _flexGrid.Cols.Fixed);
}


요약 표:

표5


10000행의 경우:

이미지13

100000행의 경우:

이미지14

1000000행의 경우:

이미지15

다음은 100개 행 스크롤과 유사한 결과입니다. 이러한 작업에 대한 절대적인 리더는 없습니다.


다시 말하지만, 결과 그리드 그리기와 .NET 5 FlexGrid의 스크롤 조합은 .NET 4.5.2보다 느리지는 않습니다.


그리고 100행 스크롤과 마찬가지로 전체 그리드 스크롤에 할당된 메모리 값을 비교할 수 없습니다.



하나의 열 정렬

공통 사용자 상호 작용 작업 중 하나는 정렬입니다.


바인딩된 FlexGrid는 DefaultView.Sort 속성을 사용하여 데이터 소스를 정렬하므로 IterationCleanup 단계가 끝날 때 각 반복에 대해 정렬되지 않은 그리드를 갖도록 이를 지웁니다.

_data.DataTable.DefaultView.Sort = null;


정렬 작업은 다음과 같이 수행할 수 있습니다.

[Benchmark]
public void SortColumn()
{
  _flexGrid.Sort(SortFlags.Ascending, _flexGrid.Cols.Fixed);
}


요약 표:

표6


10000행의 경우:

이미지17

100000행의 경우:

이미지18

1000000행의 경우:

이미지19

.NET 5와 .NET Framework 4.5.2 버전의 대부분의 측정값은 매우 비슷하지만 때로는 .NET 5 FlexGrid의 정렬이 약간 느릴 수 있습니다(최대 5%까지 느릴 수도 있음). 그리기 성능 향상의 조합으로 최종 사용자는 비슷한 시간으로 정렬된 결과를 볼 수 있습니다.


이전의 모든 테스트처럼 .NET 5 FlexGrid에 대해 최대 1.3%로 약간의 메모리 할당이 개선이 이뤄진 것을 볼 수 있습니다.



열 필터링

최종 사용자가 수행할 수 있는 또 다른 공통 작업은 필터링입니다. 필터링은 일부 기준에 맞는 데이터를 표시하고 다른 데이터를 숨깁니다. 필터링을 위해 몇 가지 기준을 선택할 수 있습니다. 여기에서 일부 열 데이터의 내부 절반을 찾습니다.


해당 추가 작업은 필터링 범위의 경계를 찾기 위해 IterationSetup 단계에 추가됩니다.

SortedSet<int> column0Values = new SortedSet<int>();
​
DataRowCollection rows = _data.DataTable.Rows;
foreach (DataRow row in rows)
{
  column0Values.Add((int)row.ItemArray[0]);
}
​
int column0ValuesCount = column0Values.Count;
int column0ValuesQuarterCount = column0ValuesCount / 4;
int column0ValuesThreeQuartersCount = column0ValuesQuarterCount * 3;
​
_condition1Parameter = column0Values.ElementAt(column0ValuesQuarterCount);
_condition2Parameter = column0Values.ElementAt(column0ValuesThreeQuartersCount);


테스트 메서드 자체는 다음과 같습니다.

[Benchmark]
public void FilterColumn()
{
  _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();
}


요약 표:

표7


10000행의 경우:

이미지20

100000행의 경우:

이미지21

1000000행의 경우:

이미지22

여기에서 알 수 있듯이 절대적인 리더는 없습니다. 필터링된 결과 그리기는 성능 개선이 없는 경우를 보완할 수 있으며 사용자는 결과를 동시에 볼 수 있습니다.


다시 말하지만, .NET 5 FlexGrid는 필터링 작업에 더 적은 메모리가 최대 1.6%로 적습니다.



열 기준 그룹화

그룹화를 통해 최종 사용자는 더 작은 샘플에서 데이터를 분석할 수 있습니다. 이것은 또 다른 공통 작업입니다.


다양한 크기의 그룹을 만들기 위해 반복적인 데이터가 포함된 DataMap이 있는 열에 대해 그룹화를 수행합니다.

[Benchmark]
public void GroupColumn()
{
  _flexGrid.GroupDescriptions = new List<GroupDescription>()
  {
      new GroupDescription(_flexGrid.Cols[_firstDataMapColumnIndex].Name, ListSortDirection.Ascending)
  };
}


요약 표:

표8


10000행의 경우:

이미지23

100000행의 경우:

이미지24

1000000행의 경우:

이미지25


그룹화 결과는 정렬과 매우 유사합니다. 가끔 .NET 5 FlexGrid가 4.5.2보다 약간 빠르며 그 반대의 경우도 있습니다.


이전 테스트처럼 .NET 5 내의 그룹화에 .NET 4.5.2보다 적은 메모리를 할당하는 것을 볼 수 있습니다. 최고의 경우 최대 1.6%를 할당합니다.



열 자동 크기 조정

경우에 따라 최종 사용자는 표시된 데이터에 맞게 모든 FlexGrid 열의 크기를 정렬해야 합니다. 이는 FlexGrid의 AutoSizeCols 메서드를 사용하여 수행할 수 있습니다.


작업은 매우 무거우며 그리드의 각 셀에서 데이터를 측정해야 합니다. 따라서 이러한 무거운 테스트의 경우 다음과 같이 최대 행 수를 줄입니다.

[Params(10000, 100000)]
public override int RowCount { get; set; }


벤치마크 메서드는 다음과 같습니다.

[Benchmark]
public void AutoSizeColumns()
{
  _flexGrid.AutoSizeCols();
}


요약 표:

표9


10000행의 경우:

이미지26

100000행의 경우:

이미지27

여기에서 볼 수 있듯이 .NET 5 FlexGrid는 최대 31%의 상당한 성능 개선이 있습니다.

NET 5 버전은 .NET 4.5.2보다 최대 8.6% 적은 메모리를 할당합니다.



행 자동 크기 조정

표시된 모든 데이터를 셀에 맞추는 다른 방법은 FlexGrid의 AutoSizeRows 메서드입니다.


데이터는 대부분 한 줄이지만, 약간의 긴 문자열이나 문, 단락이 있을 수 있습니다. 이러한 경우 데이터가 셀에 맞도록 줄 바꿈을 설정해야 합니다.

_flexGrid.Styles.Normal.WordWrap = true;


다시 AutoSizeColumns 테스트와 같은 방법으로 최대 행 수를 줄입니다.

[Params(10000, 100000)]
public override int RowCount { get; set; }


벤치마크 메서드 자체는 다음과 같습니다.

[Benchmark]
public void AutoSizeRows()
{
  _flexGrid.AutoSizeRows();
}


요약 표:

표10


10000행의 경우:

이미지28

100000행의 경우:

이미지29

이번에는 성능에 큰 차이가 없으며 매우 유사한 결과를 얻었습니다.


이전의 모든 테스트와 마찬가지로 .NET 5 FlexGrid 행 자동 크기 조정에 필요한 메모리가 최대 17.9% 적습니다.


이 블로그 게시물에서는 최종 사용자가 .NET 5와 .NET Framework 4.5.2용 FlexGrid를 사용하여 수행할 수 있는 몇 가지 공통 작업을 측정했습니다.


모든 데이터 크기의 테스트 작업에서 .NET 5 FlexGrid는 .NET 4.5.2 버전보다 더 적은 메모리가 필요합니다. 즉 .NET 5 위에 응용 프로그램을 작성(또는 포팅)하면 PC의 다른 응용 프로그램에서 이러한 초과 메모리를 프로세스에 사용할 수 있습니다.


그리드 그리기 및 열 크기 조정(열 셀의 데이터 텍스트 측정) 2가지 공통 작업에서 상당한 성능 개선을 발견했습니다. 그리드 페인팅은 .NET Framework 4.5.2보다 .NET 5에서 최대 1.3배 더 빠릅니다. 이는 그리드 내의 데이터 조작 결과가 .NET 4.5.2보다 .NET 5 응용 프로그램에서 더 빨리 표시된다는 것을 의미합니다. 열 크기 조정을 통해 .NET 5는 모든 열의 데이터를 최대 1.7배 더 빠르게 맞출 수 있습니다.


이 블로그 게시물을 통해 측정된 데이터벤치마크 응용 프로그램을 사용하여 .NET 5 FlexGrid 성능 개선 사항을 직접 확인하십시오.




지금 바로 ComponentOne을 다운로드하여 직접 테스트해보세요!

c1.png

 
  • 페이스북으로 공유
  • 트위터로  공유
  • 구글플러스로 공유
  • 카카오톡으로 보내기

댓글목록

등록된 댓글이 없습니다.

그레이프시티 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기

인기글

더보기
  • 인기 게시물이 없습니다.
그레이프시티 홈페이지를 통해 제품에 대해서 더 자세히 알아 보세요!
홈페이지 바로가기
이메일 : sales-kor@grapecity.com | 전화 : 1670-0583 | 경기도 안양시 동안구 시민대로 230, B-703(관양동, 아크로타워) 그레이프시티(주) 대표자 : 허경명 | 사업자등록번호 : 123-84-00981 | 통신판매업신고번호 : 2013-경기안양-00331 Copyright ⓒ 2021 GrapeCity inc.