[C# 문법] Reference Tuple vs Value Tuple 성능 비교

참조



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

이 글을 공유하기

댓글

Designed by JB FACTORY