らくがきちょう

なんとなく ~所属組織/団体とは無関係であり、個人の見解です~

C# で FastEnum を試す

FastEnum はキャッシュを効果的に活用することで標準の System.Enum よりも速度を改善したライブラリだそうです。 今回は「どのくらい速いのか?」実際に試してみます。 言語は C# を使います。

NuGet でインストールする

NuGet を使うことで簡単にソリューションへ追加出来ます。 Visual StudioプロジェクトNuGet パッケージの管理 の順でクリックします。

f:id:sig9:20191123171958p:plain

参照 タブをクリックし、検索ボックスに「FastEnum」と入力します。 しばらくすると検索結果に FastEnum が表示されるので、これをクリックし、右側の インストール ボタンをクリックします。

f:id:sig9:20191123172010p:plain

「変更のプレビュー」が表示されるので OK をクリックします。

f:id:sig9:20191123172021p:plain

「ライセンスへの同意」が表示されるので 同意する をクリックします。 これでソリューションに FastEnum が追加されました。

f:id:sig9:20191123172031p:plain

テストコード

テストコードは以下の通りです。 今回は TryParse しか試していません。

using System;
using System.Diagnostics;
using FastEnumUtility;

namespace FastEnumCore
{
    class Program
    {
        enum Alphabets
        {
            A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z
        }

        static void Main(string[] args)
        {
            TestEnum(100);
            TestEnum(1000);
            TestEnum(10000);
            TestEnum(100000);
            TestEnum(1000000);
            TestEnum(10000000);
        }

        static void TestEnum(int count)
        {
            // Enum
            var timer1 = new Stopwatch();
            timer1.Start();
            for (int i = 0; i < count; i++)
            {
                var result = Enum.TryParse<Alphabets>("Z", out var value);
            }
            timer1.Stop();

            // FastEnum
            var timer2 = new Stopwatch();
            timer2.Start();
            for (int i = 0; i < count; i++)
            {
                var result = FastEnum.TryParse<Alphabets>("Z", out var value);
            }
            timer2.Stop();

            Console.WriteLine(String.Format("[{0,8}]", count) + "Enum    :" + timer1.Elapsed.TotalSeconds);
            Console.WriteLine(String.Format("[{0,8}]", count) + "FastEnum:" + timer2.Elapsed.TotalSeconds);
        }
    }
}

実行結果

実行結果は以下の通りです。

[     100]Enum    :0.0033274999999999997
[     100]FastEnum:0.0347969
[    1000]Enum    :0.000355
[    1000]FastEnum:3.43E-05
[   10000]Enum    :0.0034844999999999998
[   10000]FastEnum:0.00033069999999999996
[  100000]Enum    :0.0350198
[  100000]FastEnum:0.0033785
[ 1000000]Enum    :0.283574
[ 1000000]FastEnum:0.019107799999999998
[10000000]Enum    :2.565835
[10000000]FastEnum:0.17820419999999998

参考