Pages

2013/02/19

[C#] Enum の存在チェックは奥が深い。

ある値が、Enum に含まれているかどうかのチェックには色々な方法があるのだが、回すやり方が速いようだ。少々意外な結果である。
class Program
    {
        enum MyEnum { a = 0, b, c }
        private const int loop = 10000000;

        static bool IsDefined(MyEnum myEnum)
        {
            var b = false;
            switch (myEnum)
            {
                case MyEnum.a:
                case MyEnum.b:
                case MyEnum.c:
                    b = true;
                    break;
            }
            return b;
        }

        static void Main(string[] args)
        {
            var sw = new Stopwatch();

            // Enum.IsDefined
            sw.Start();
            for (int i = 0; i < loop; ++i)
            {
                Enum.IsDefined(typeof(MyEnum), 0);
            }
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds);

            // 泥臭い ? やり方
            sw.Reset();
            sw.Start();
            for (int i = 0; i < loop; ++i)
            {
                IsDefined((MyEnum)0);
            }
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds);

            // TryParse
            sw.Reset();
            sw.Start();
            for (int i = 0; i < loop; ++i)
            {
                var myEnum = new MyEnum();
                var b = Enum.TryParse("0", out myEnum);
            }
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds);

            // 強引に LINQ を使う
            sw.Reset();
            sw.Start();
            for (int i = 0; i < loop; ++i)
            {
                Enum.GetValues(typeof(MyEnum)).Cast().Contains((MyEnum)0);
            }
            sw.Stop();
            Console.WriteLine(sw.ElapsedMilliseconds);

            /*
             * 2544
             * 126
             * 4603
             * 26415
             */

        }

    }
あとは、IsDefined のパフォーマンスが悪いという話をよく目にするが、実際はそれほど問題になるようなことはないと思う。それならソースの見通しを良くしておいた方がいいかな、というのが持論。

Related Posts Plugin for WordPress, Blogger...