[C# 벤치마크]BenchMarkDotNet 사용법 - RunStrategy 선택
- C#/C# 문법
- 2021. 12. 13. 19:06
참조
소개
- 벤치마크를 실행하는 경우 항상 작업을 사용합니다.
- 각 작업에는 서로 다른 벤치마크 모드들이 있고, 각 모드를 전환할 수도 있습니다.
- 기본 RunStrategy는 처리랼이며 대부분의 경우 잘 작동합니다.
Throughput(처리량)
- Throughput(처리량)은 기본 RunStrategy이며 벤치마킹에 완벽하게 작동합니다.
- 파일럿 반복 세트 기반으로 기본 반복의 작업 양을 자동으로 선택합니다.
- 반복 횟수도 정확도 작업 설정에 따라 자동으로 선택됩니다.
[SimpleJob(launchCount: 3, warmupCount: 10, targetCount: 30)]
public class MyBenchmarkClass
IntroColdStart 예제 코드
- ColdStart를 측정하려면 ColdStart 전략을 선택하면 됩니다.
[SimpleJob(RunStrategy.ColdStart, launchCount:50)]
public class MyBenchmarkClass
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Engines;
using BenchmarkDotNet.Running;
using System.Collections.Generic;
namespace BenchMarkTest
{
class Program
{
static void Main(string[] args)
{
var summary = BenchmarkRunner.Run<IntroColdStart>();
}
}
[SimpleJob(RunStrategy.ColdStart, targetCount:1)]
[MinColumn, MaxColumn, MeanColumn, MedianColumn]
public class IntroColdStart
{
public List<int> list = new();
public void AddList()
{
int count = 10000000;
for(int index = 0; index < count; index++)
{
list.Add(index);
}
}
[Benchmark]
public int ForTest()
{
int sum = 0;
AddList();
if (list.Count < 0 || list == null)
return 0;
for(int index = 0; index < list.Count; index++)
{
sum += list[index];
}
return sum;
}
[Benchmark]
public int ForeachTest()
{
int sum = 0;
AddList();
if (list.Count < 0 || list == null)
return 0;
foreach (var item in list)
{
sum += item;
}
return sum;
}
}
}
실행 결과
- Attribute에 설정한 값들이 결과값으로 나온 것을 확인할 수 있습니다.
IntroMonitoring 예제 코드
- 벤치마크 시간이 100ms 이상 걸리는 경우에는 모니터링 전약을 사용할 수도 있습니다.
- 모니터링 방법은 측정 셋을 수집하고 통계를 얻는데 유용합니다.
[SimpleJob(RunStrategy.Monitoring, launchCount: 10, warmupCount: 0, targetCount: 100)]
public class MyBenchmarkClass
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Engines;
using BenchmarkDotNet.Running;
using System;
using System.Collections.Generic;
using System.Threading;
namespace BenchMarkTest
{
class Program
{
static void Main(string[] args)
{
var summary = BenchmarkRunner.Run<IntroColdStart>();
}
}
[SimpleJob(RunStrategy.Monitoring, targetCount:5, id:"MonitoringJob")]
[MinColumn, Q1Column, Q3Column, MaxColumn]
public class IntroColdStart
{
public List<int> list = new();
public void AddList()
{
int count = 10000000;
for(int index = 0; index < count; index++)
{
list.Add(index);
}
}
[Benchmark]
public int ForTest()
{
int sum = 0;
AddList();
if (list.Count < 0 || list == null)
return 0;
for(int index = 0; index < list.Count; index++)
{
sum += list[index];
}
return sum;
}
[Benchmark]
public int ForeachTest()
{
int sum = 0;
AddList();
if (list.Count < 0 || list == null)
return 0;
foreach (var item in list)
{
sum += item;
}
return sum;
}
}
}
실행 결과
- 모니터링 Attribute를 설정하게 되면 다음과 같이 결과들이 나열돼서 나온것을 확인할 수 있습니다.
// BeforeActualRun
WorkloadActual 1: 1 op, 137332500.00 ns, 137.3325 ms/op
WorkloadActual 2: 1 op, 120452200.00 ns, 120.4522 ms/op
WorkloadActual 3: 1 op, 216106300.00 ns, 216.1063 ms/op
WorkloadActual 4: 1 op, 165665500.00 ns, 165.6655 ms/op
WorkloadActual 5: 1 op, 202395900.00 ns, 202.3959 ms/op
// AfterActualRun
WorkloadResult 1: 1 op, 137332500.00 ns, 137.3325 ms/op
WorkloadResult 2: 1 op, 120452200.00 ns, 120.4522 ms/op
WorkloadResult 3: 1 op, 216106300.00 ns, 216.1063 ms/op
WorkloadResult 4: 1 op, 165665500.00 ns, 165.6655 ms/op
WorkloadResult 5: 1 op, 202395900.00 ns, 202.3959 ms/op
728x90
'C# > C# 문법' 카테고리의 다른 글
[C# 문법] C# 현재 디렉토리 위치 변경하는 방법 - Directory.SetCurrentDirectory 메서드 (0) | 2021.12.14 |
---|---|
[C# 벤치마크] BenchMarkDotNet IntroArgument (0) | 2021.12.14 |
[C# 문법] Reference Tuple vs Value Tuple 성능 비교 (0) | 2021.12.08 |
[C# 문법] 정적 Regex, 객체 생성 Regex 성능 비교 (0) | 2021.12.08 |
[C# 문법] Dictionary ContainsKey vs TeyGetValue 성능 차이 (0) | 2021.12.07 |
이 글을 공유하기