[C# 벤치마크] IntroCategories 사용방법

소개

  • 안녕하세요. 오늘은 BenchMarkDotNet에 대해서 학습해 보려고 합니다.
  • 그 중에서도, IntroCategories 관련 내용에 대해서 알아 보도록 하겠습니다.

IntroCategories

  • [BenchmarkCategory] 속성과 함께 사용 하면 벤치마크를 범주로 그룹화하고 범주별로 필터링 할 수 있습니다.
  • 예제 코드를 통해서 어떻게 Category를 지정하는지 알아보겠습니다.

예제코드

using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using System;
using System.Collections.Generic;
using System.Linq;

namespace BenchMarkTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var summary = BenchmarkRunner.Run<IntroCategories>();
        }
    }

    [DryJob]
    [CategoriesColumn]
    [BenchmarkCategory("Awesome")]
    [AnyCategoriesFilter("A", "1", "2")]
    public class IntroCategories
    {
        [Benchmark]
        [ArgumentsSource(nameof(DataA))]
        [BenchmarkCategory("A", "1")]
        public int ArrayIndexOfA(int[] array, int value)
        {
            return Array.IndexOf(array, value);
        }

        [Benchmark]
        [ArgumentsSource(nameof(DataA))]
        [BenchmarkCategory("A", "2")]
        public int ManualIndexOfA(int[] array, int value)
        {
            for (int index = 0; index < array.Length; index++)
            {
                if (array[index] == value)
                {
                    return index;
                }
            }

            return -1;
        }

        [Benchmark]
        [ArgumentsSource(nameof(DataB))]
        [BenchmarkCategory("B", "1")]
        public int ArrayIndexOfB(int[] array, int value)
        {
            return Array.IndexOf(array, value);
        }

        [Benchmark]
        [ArgumentsSource(nameof(DataB))]
        [BenchmarkCategory("B", "2")]
        public int ManualIndexOfB(int[] array, int value)
        {
            for (int index = 0; index < array.Length; index++)
            {
                if (array[index] == value)
                {
                    return index;
                }
            }

            return -1;
        }

        public IEnumerable<object[]> DataA()
        {
            yield return new object[] { new int[] { 1, 2, 3, }, 4 };
            yield return new object[] { Enumerable.Range(0, 100).ToArray(), 4 };
            yield return new object[] { Enumerable.Range(0, 100).ToArray(), 101 };
        }

        public IEnumerable<object[]> DataB()
        {
            yield return new object[] { new int[] { 1, 2, 3, }, 4 };
            yield return new object[] { Enumerable.Range(0, 100).ToArray(), 4 };
            yield return new object[] { Enumerable.Range(0, 100).ToArray(), 101 };
        }
    }
}

실행 결과

  • 현재 카테고리 필터가 "A", "1", "2" 라고 지정되어 있기 때문에, A_1, A_2, B_1, B_2 모두 필터에 검색되어 벤치마크 실행된 것을 확인할 수 있습니다.
|         Method |  Categories |      array | value |     Mean | Error |
|--------------- |------------ |----------- |------ |---------:|------:|
|  ArrayIndexOfA | A,1,Awesome | Int32[100] |     4 | 288.0 us |    NA |
| ManualIndexOfA | A,2,Awesome | Int32[100] |     4 | 303.9 us |    NA |
|  ArrayIndexOfB | B,1,Awesome | Int32[100] |     4 | 265.2 us |    NA |
| ManualIndexOfB | B,2,Awesome | Int32[100] |     4 | 283.0 us |    NA |
|  ArrayIndexOfA | A,1,Awesome |   Int32[3] |     4 | 261.7 us |    NA |
| ManualIndexOfA | A,2,Awesome |   Int32[3] |     4 | 282.7 us |    NA |
|  ArrayIndexOfB | B,1,Awesome |   Int32[3] |     4 | 273.7 us |    NA |
| ManualIndexOfB | B,2,Awesome |   Int32[3] |     4 | 300.8 us |    NA |
|  ArrayIndexOfA | A,1,Awesome | Int32[100] |   101 | 274.3 us |    NA |
| ManualIndexOfA | A,2,Awesome | Int32[100] |   101 | 310.4 us |    NA |
|  ArrayIndexOfB | B,1,Awesome | Int32[100] |   101 | 289.0 us |    NA |
| ManualIndexOfB | B,2,Awesome | Int32[100] |   101 | 288.8 us |    NA |
728x90

이 글을 공유하기

댓글

Designed by JB FACTORY