.NET 5와 .NET Framework 컨트롤 간의 성능을 비교하는 방법 > 시티즌 인사이트

본문 바로가기

시티즌 커뮤니티

시티즌 인사이트

IT&개발 정보 .NET 5와 .NET Framework 컨트롤 간의 성능을 비교하는 방법

페이지 정보

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

본문

Microsoft는 2020년 11월 10일 .Net Conf 2020에서 아주 인기 있는 응용 프로그램 개발 플랫폼인 .NET 5의 최신 버전을 출시했습니다. 현재 GrapeCity에서는 다양한 .NET 개발 플랫폼, 특히 WinForms 플랫폼을 위한 .NET 5 UI 컨트롤을 제공했습니다. 이러한 컨트롤은 .NET 6 이상의 모든 향후 버전의 기초가 될 것입니다.


GrapeCity는 WinForms의 주력 컨트롤인 FlexGrid를 기반으로 .NET 5와 .NET 4.5.2의 성능 비교 결과를 제시하고 싶지만 먼저 FlexGrid의 성능을 테스트하고 측정하는 방법을 파악해야 합니다.


이 블로그는 .NET 5용 FlexGrid와 .NET Framework 4.5.2를 비교하는 간단한 벤치마크 응용 프로그램의 설정, 빌드, 실행 및 출력 결과를 얻는 방법에 대해 설명합니다.



설정

지난해의 BenchmarkDotNet은 .NET 코드의 성능을 측정하기 위한 표준 도구가 되었습니다. 이는 Microsoft와 같은 다양한 회사에서 .NET 런타임의 성능을 측정하는 데 널리 사용됩니다.


이 블로그에서는 이 도구를 사용하여 벤치마크를 만들고 .NET Framework 4.5.2 및 .NET 5 FlexGrid의 성능을 비교합니다.



프로젝트 정의

.csproj 파일의 기본 내용은 다음과 같습니다.

<Project Sdk="Microsoft.NET.Sdk">
​
<PropertyGroup>
  <OutputType>Exe</OutputType>
  <TargetFrameworks>net461;net5.0-windows</TargetFrameworks>
  <EnableDefaultCompileItems>false</EnableDefaultCompileItems>
  <EnableDefaultEmbeddedResourceItems>false</EnableDefaultEmbeddedResourceItems>
  <EnableDefaultNoneItems>false</EnableDefaultNoneItems>
</PropertyGroup>
​
<PropertyGroup Condition="'$(TargetFramework)'=='net461'">
  <DefineConstants>CLR461</DefineConstants>
</PropertyGroup>
​
<PropertyGroup Condition="'$(TargetFramework)'=='net5.0-windows'">
  <DefineConstants>CLR5</DefineConstants>
  <UseWindowsForms>true</UseWindowsForms>
</PropertyGroup>
​
<ItemGroup>
  <PackageReference Include="BenchmarkDotNet" Version="0.13.0" />
</ItemGroup>
​
<ItemGroup Condition="'$(TargetFramework)'=='net461'">
  <Reference Include="System.Windows.Forms" />
  <PackageReference Include="C1.Win.C1FlexGrid" Version="4.5.20211.502" />
  <EmbeddedResource Include="Properties\licenses.licx" />
</ItemGroup>
​
<ItemGroup Condition="'$(TargetFramework)'=='net5.0-windows'">
  <PackageReference Include="C1.Win.FlexGrid" Version="5.0.20211.502" />
</ItemGroup>
​
</Project>


이를 통해 .NET Framework 4.6.1 및 .NET 5에 대한 벤치마크를 실행할 수 있습니다.


.csproj 파일은 다양한 런타임에 대한 C1FlexGrid NuGet 패키지를 참조합니다. 또한 벤치마크를 만드는 데 사용하는 Benchmark.NET NuGet 패키지(버전 0.13.0의 최신 릴리스)를 참조합니다.


패키지에 .NET Framework 4.5.2 및 .NET 5 C1FlexGrid 컨트롤에 대해 서로 다른 네임스페이스가 있지만 조건부 컴파일 기호를 사용하여 벤치마크 파일 내에 적절한 네임스페이스를 포함합니다.


런타임

BenchmarkDotNet은 netstandard2.0을 대상으로 하므로 .NET 4.5.2 측정을 위한 대상 프레임워크로 .NET Framework 4.5.2를 사용할 수 없습니다.


그러나 BenchmarkDotNet 문서에서는 다음과 같이 설명합니다.


전체 .NET Framework는 항상 지정된 컴퓨터에서 사용 가능한 최신 .NET Framework를 사용하여 모든 .NET 실행 파일을 실행합니다. 따라서 몇 가지 .NET TFM에 대한 벤치마크를 실행하려고 하면 모두 컴퓨터의 최신 .NET Framework를 사용하여 실행됩니다. 유일한 차이점은 컴파일된 대상 버전에 따라 다른 기능이 활성화된다는 것입니다. 이에 대한 자세한 내용은 여기여기를 참조하세요. 이는 BenchmarkDotNet이나 기타 도구로 제어할 수 없는 .NET Framework 동작입니다.


따라서 측정에는 사용 가능한 가장 가까운 대상 프레임워크 .NET 4.5.2 FlexGrid – .NET 4.6.1을 사용하여 사용 가능한 기능을 줄입니다. 사용 가능한 최신 .Net Framework 런타임 4.8에서 실행됩니다.



실행 방법

벤치마크를 실행하기 위해 Visual Studio 개발자 명령 프롬프트에서 다음 명령을 실행합니다.

dotnet run -c Release -f net461 --runtimes net461 net5.0-windows --filter **


그러나 때때로 dotnet.exe는 .licx 파일을 포함한 프로젝트를 빌드할 수 없고 오류가 발생합니다.


오류 MSB4062: "Microsoft.Build.Tasks.LC" 작업은 Microsoft.Build.Tasks.Core, Version=15.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a 어셈블리에서 로드할 수 없습니다.


UsingTask 선언이 올바른지 어셈블리와 모든 의존성이 사용 가능한지 작업에 Microsoft.Build.Framework.ITask를 구현하는 공개 클래스가 포함되어 있는지 확인합니다.


또한 dotnet.exe가 지원하지 않는다는 posted issue가 있습니다.


이 경우 Visual Studio(릴리스 구성에서)로 프로젝트를 빌드하고 다음 명령을 실행할 수 있습니다.

dotnet run -c Release -f net461 --runtimes net461 net5.0-windows --filter ** --no-build


두 명령 모두 벤치마크 응용 프로그램의 루트 폴더에서 .cmd 파일로 사용할 수 있습니다.



하드웨어

이 블로그 게시물에서 제공하는 모든 측정값은 Intel Core i9-10980HK 2.40GHz CPU, NVIDIA GeForce RTX 2080 Super Max-Q 그래픽 어댑터, 32GB DDR4 RAM, M.2 NVMe PCIe 3.0 SSD, 15.6" 4K/UHD 250% 배율 디스플레이가 장착된 노트북에서 수행된 결과입니다.


노트북 브랜드와 모델은 ASUS ROG Zephyrus Duo 15 GX550LXS-HC066T입니다.



데이터 생성

벤치마크에서 FlexGrid를 DataSource에 바인딩합니다. 이는 데이터 그리드 컨트롤, 특히 FlexGrid를 사용하는 일반적인 시나리오입니다.


다음 유형의 열이 있는 데이터 표를 제공하는 데이터 생성기 유틸리티 클래스가 있습니다.

private static readonly Type[] DataTypes = new Type[]
{
  typeof(int),
  typeof(string),
  typeof(double),
  typeof(DateTime),
  typeof(decimal),
  typeof(bool),
  typeof(int) // for DataMap
};


위에서 정의한 유형의 열 구조는 열의 수를 초과하지 않을 때까지 반복됩니다. 마지막 열은 FlexGrid DataMap 속성에 사용되며, 이는 고객이 응용 프로그램에서 사용하는 또 다른 일반적인 시나리오입니다.


GrapeCity는 데이터 생성을 위해 임의 클래스를 사용합니다. 이 클래스는 다른 값(숫자, 날짜, 공백을 포함하거나 포함하지 않는 다른 문자가 포함된 문자열)을 생성합니다.


그러나 생성된 DataTable을 각 반복부마다 안정적으로 만들기 위해 시드 매개 변수와 함께 임의 클래스 생성자를 사용합니다.

Random _random = new Random(0);


이 접근 방식을 사용하면 동일한 행과 열 수에 대해 동일한 데이터를 얻고 이질적인 데이터 값을 얻을 수 있습니다.



벤치마크용 기본 클래스

벤치마크의 기본으로 다음 클래스를 사용합니다.

[MemoryDiagnoser]
[RPlotExporter]
[MinIterationCount(30)]
[MaxIterationCount(10000)]
public abstract class BaseBenchmarks
{
  [Params(10000, 100000, 1000000)]
  public virtual int RowCount { get; set; }
​
  [Params(20, 50, 100, 200)]
  public virtual int ColumnCount { get; set; }
}


몇 가지 BenchmarkDotNet 속성은 다음과 같습니다.

  • MemoryDiagnoser – 벤치마크에 할당된 메모리를 측정할 수 있습니다.

  • RPlotExporter – 스크립트(BuildPlots.R)를 생성합니다. R은 결과를 설명하는 다양한 그림을 생성합니다. 이 블로그에서는 작업 측정값의 발생 횟수를 보여 주는 밀도 그림을 제공합니다.

  • MinIterationCount, MaxIterationCount – 이 값은 각 벤치마크 반복 횟수의 최솟값 및 최댓값을 정의합니다. BenchmarkDotNet이 내부 알고리즘으로 선택하는 반복 횟수의 구체적인 값입니다.


또한 Params 속성의 값이 서로 다른 RowCountColumnCount라는 두 가지 속성이 있습니다. 이러한 속성은 벤치마크에 대해 생성되는 데이터의 양(DataTable의 행 및 열 수)을 정의합니다. 일부 테스트는 이를 다른 값으로 변경하기 때문에 이러한 속성을 가상 속성으로 정의했습니다.


설명된 기본 클래스에서 파생된 각 벤치마크 클래스.



벤치마크 설정 및 정리

BenchmarkDotNet을 사용하면 벤치마크 이전 이후의 일부 코드를 실행할 수 있습니다. 데이터 준비, FlexGrid 설정, 부모 폼에 이러한 기능을 사용합니다.


대부분의 경우 GlobalSetup 메서드에서 모든 데이터를 생성합니다.

[GlobalSetup]
public void GlobalSetup()
{
  _data = DataGenerator.Generate(RowCount, ColumnCount);
}


그리고 GlobalCleanup 메서드에서 삭제합니다.

[GlobalCleanup]
public void GlobalCleanup()
{
  _data?.Dispose();
  _data = null;
}


각 벤치마크 반복에 대해 폼을 만들고 FlexGrid를 배치하고 폼을 표시하고 FlexGrid를 색칠합니다.

[IterationSetup]
public void IterationSetup()
{
  _form = new Form() { WindowState = FormWindowState.Maximized };
  _flexGrid = new C1FlexGrid() { Dock = DockStyle.Fill, UseCompatibleTextRendering = false };
  _form.Controls.Add(_flexGrid);
  _form.Show();
  _flexGrid.Refresh();
}


이전 코드 조각에서 새로 고침 메서드를 사용하여 벤치마크를 실행하기 전에 모든 항목이 그려졌고 올바른 데이터가 표시되는지 확인했습니다.


또한 각 벤치마크 반복할 때마다 FlexGrid는 한 번 더 색칠하고 폼과 FlexGrid를 삭제합니다.

[IterationCleanup]
public void IterationCleanup()
{
  _flexGrid.Refresh();
  _flexGrid?.Dispose();
  _flexGrid = null;
  _form?.Dispose();
  _form = null;
}


이 설정을 통해 모든 반복에 대해 한 번 데이터를 생성하며 이전 설정의 영향을 받지 않고 모든 반복에 대해 깨끗한 FlexGrid를 사용할 수 있습니다.



출력

측정이 완료되면 BenchmarkDotNet은 결과를 포함한 멋진 표를 생성합니다. 하지만 어떤 이유로든 먼저 매개 변수별로 표 항목을 정렬합니다.


이 클래스를 주문자로 사용하여 벤치마크 클래스 및 이름, 매개 변수 및 런타임별로 정렬된 출력을 구성합니다.

public class SummaryOrderer : DefaultOrderer
{
  public override IEnumerable<BenchmarkCase> GetSummaryOrder(ImmutableArray<BenchmarkCase> benchmarksCase, Summary summary) =>
      from benchmark in benchmarksCase
      orderby benchmark.Descriptor.Type.ToString(),
          benchmark.Descriptor.WorkloadMethod.Name,
          benchmark.Parameters["RowCount"],
          benchmark.Parameters["ColumnCount"],
          benchmark.Job.Environment.Runtime.Name descending
      select benchmark;
}


앞서 언급했듯이 벤치마크 클래스에 대한 RPlotExplorer 속성을 사용하여 측정 중 연산의 측정값을 보여주는 밀도 그림을 얻을 수 있습니다.



벤치마크 메서드

AutoSizeCols 메서드로 실행할 수 있는 열 크기의 자동 조정이라는 공통 FlexGrid 테스트 작업을 간략하게 설명했습니다.


테스트 메서드에 대한 간략한 설명이기 때문에 테스트 실행 시간이 길지 않도록 최대 행 수를 줄입니다.

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


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

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


출력 요약 표는 다음과 같습니다.

요약 표


밀도곡선 그래프로는 아래와 같이 나타낼 수 있습니다.

밀도 그림


이 블로그에서는 FlexGrid for .NET 5 및 .NET Framework 4.5.2를 비교하는 간단한 벤치마크 응용 프로그램의 설정, 빌드, 실행 및 출력 결과를 얻는 방법을 설명합니다.


다음 포스팅에서는 FlexGrid의 다양한 공통 작업을 측정하고 .NET Framework 4.5.2와 비교하여 .NET 5의 향상된 성능을 분석하겠습니다.





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

댓글목록

등록된 댓글이 없습니다.

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

인기글

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