[C# 문법] Reference Tuple vs Value Tuple 성능 비교
- C#/C# 문법
- 2021. 12. 8. 20:56
참조
Reference Type vs Value Tuple 성능 비교
- .NET Framework 4.0 부터 Tuple 이라는 개념이 도입 되었고, 해당 Tuple은 Reference Tuple 입니다.
- 시간이 흘러, .NET Framework 4.7 이상, C# 7.0 부터 Vaule Tuple 개념이 도입되었습니다.
- Value Tuple이 Reference Tuple보다 성능이 좋다고 합니다.
- 실제로 Value Tuple이 Reference Tuple 보다 더 빠른지 테스트 진행하였습니다.
- 성능 비교는 BenchMarkDotNet NuGet Package를 다운로드 받아서 성능 측정 비교하였습니다.
테스트 코드
- Reference Tuple, Value Tuple 성능 비교를 위하여 테스트 코드를 작성하였습니다.
- 100, 1000000, 10000000 총 3번의 반복문을 돌려서 각각 어떤 결과가 나오는지 테스트 진행하였습니다.
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Diagnosers;
using BenchmarkDotNet.Running;
using System;
using System.Collections.Generic;
namespace RegexTest
{
class Program
{
static void Main(string[] args)
{
var summary = BenchmarkRunner.Run<DataLocality>();
}
}
[MemoryDiagnoser]
public class DataLocality
{
[Params(100, 1000000, 10000000)]
public int Count { get; set; }
[Benchmark(Baseline = true)]
public void IteratorValueTypes()
{
Dictionary<ValueTuple<int, int>, int> dic = new();
for (int index = 0; index < Count; index++)
{
ValueTuple<int, int> tuple = (index, index);
if (dic.ContainsKey(tuple) == false)
{
dic.Add(tuple, index);
}
}
}
[Benchmark]
public void IterateReferenceTypes()
{
Dictionary<Tuple<int, int>, int> dic = new();
for(int index = 0; index < Count; index++)
{
Tuple<int, int> tuple = new Tuple<int, int>(index, index);
if (dic.ContainsKey(tuple) == false)
{
dic.Add(tuple, index);
}
}
}
}
}
테스트 진행 결과
- 테스트 진행 결과, Value Tuple이 Reference Tuple보다 빠르다는 것을 확인하였습니다.
Method | Count | Mean | Error | StdDev | Ratio | RatioSD | Gen 0 | Gen 1 | Gen 2 | Allocated |
---|---|---|---|---|---|---|---|---|---|---|
IteratorValueTypes | 100 | 5.753 us | 0.0948 us | 0.0886 us | 1.00 | 0.00 | 1.2131 | 0.0229 | - | 10 KB |
IterateReferenceTypes | 100 | 11.167 us | 0.1658 us | 0.1551 us | 1.94 | 0.05 | 2.6550 | 0.0916 | - | 22 KB |
IteratorValueTypes | 1000000 | 138,152.144 us | 2,537.9358 us | 4,444.9899 us | 1.00 | 0.00 | 1250.0000 | 1250.0000 | 1250.0000 | 73,675 KB |
IterateReferenceTypes | 1000000 | 400,105.132 us | 7,946.7686 us | 15,499.5619 us | 2.90 | 0.14 | 20000.0000 | 8000.0000 | 4000.0000 | 211,183 KB |
IteratorValueTypes | 10000000 | 2,218,697.543 us | 35,882.9396 us | 31,809.2913 us | 1.00 | 0.00 | 4000.0000 | 4000.0000 | 4000.0000 | 644,933 KB |
IterateReferenceTypes | 10000000 | 3,872,854.800 us | 55,145.7770 us | 51,583.3940 us | 1.74 | 0.04 | 187000.0000 | 66000.0000 | 10000.0000 | 2,099,699 KB |
728x90
'C# > C# 문법' 카테고리의 다른 글
[C# 벤치마크] BenchMarkDotNet IntroArgument (0) | 2021.12.14 |
---|---|
[C# 벤치마크]BenchMarkDotNet 사용법 - RunStrategy 선택 (0) | 2021.12.13 |
[C# 문법] 정적 Regex, 객체 생성 Regex 성능 비교 (0) | 2021.12.08 |
[C# 문법] Dictionary ContainsKey vs TeyGetValue 성능 차이 (0) | 2021.12.07 |
[C#] NuGet Package 설정 파일 packages.config vs PackageReference 차이 (0) | 2021.12.06 |
이 글을 공유하기