コガネブログ

平日更新を目標に Unity や C#、Visual Studio、ReSharper などのゲーム開発アレコレを書いていきます

【C#】高速な列挙型の API を使用できる「FastEnum」紹介

はじめに

「FastEnum」をプロジェクトに追加することで
高速な列挙型の API を使用できるようになります

インストール

f:id:baba_s:20190826132012p:plain

Visual Studio メニューの「ツール>NuGet パッケージ マネージャー>
ソリューションの NuGet パッケージの管理」を選択します

f:id:baba_s:20190907133159p:plain

「参照」タブを選択して、検索欄に「FastEnum」と入力して
表示された「FastEnum」を選択します

f:id:baba_s:20190907133207p:plain

インストールしたいプロジェクトをチェックして「インストール」ボタンを押します

使い方

using FastEnum;

...

// Enum.GetValues
var values = FastEnum<Fruits>.Values;

// Enum.GetNames
var names = FastEnum<Fruits>.Names;

// Enum.ToString
var name = Fruits.Apple.ToName();

// Enum.IsDefined
var defined = FastEnum<Fruits>.IsDefined( Fruits.Apple );

// Enum.Parse
var value = FastEnum<Fruits>.Parse( "Apple" );

// Enum.TryParse
var ok = FastEnum<Fruits>.TryParse( "Apple", out var value );

速度検証

using FastEnum;
using System;
using System.Diagnostics;

class Program
{
    enum Fruits
    {
        Unknown,
        Apple,
        Banana,
        Peach,
        Orange,
        Grape,
        Lemon,
        Melon,
        Strawberry,
        Cherry,
        WaterMelon,
        Pear,
        Pineapple,
    }

    static void Main()
    {
        var count = 100000;

        var sw = new Stopwatch();
        sw.Start();

        for ( int i = 0; i < count; i++ )
        {
            var result = FastEnum<Fruits>.TryParse( "Apple", out var value );
        }

        sw.Stop();

        Console.WriteLine( sw.Elapsed.TotalSeconds );
    }
}

上記のようなコードで各関数を
100,000 回呼び出したときにかかった時間(秒)を計測しました

関数 通常 FastEnum
GetValues 0.3975 秒 0.0327 秒
GetNames 0.0194 秒 0.0274 秒
ToString 0.0729 秒 0.0318 秒
IsDefined 0.0519 秒 0.0310 秒
Parse 0.0492 秒 0.0453 秒
TryParse 0.0460 秒 0.0448 秒