Top > Programming > .NetFramework > Tips > NullOrBool
Last-modified: Mon, 28 Oct 2013 04:10:11 JST
Counter:929 Today:2 Yesterday:0 Online:7
このエントリーをはてなブックマークに追加

あるデータの存在を示す実装をするとき null か bool か

About

"あるデータが存在するかどうか確認する"という条件を満たすプログラムを実装する場合に、実装のパターンは大きく2つあります。1つはデータがnullであるかどうかを確認する方法、もう1つはそのデータが存在するかどうかを示すboolなどを設ける方法です。nullであるかどうか、を検証するほうが計算コストがかかりそうなのは想像つくのですが、ここではパフォーマンスにどの程度の差がつくのかを検証します。

検証コード

ここで検証するソースコードは次の通りです。解説に当たって重要な個所もなく、長すぎることもないので全文を掲載しています。前半部分では、ランダムで true または false であるbool型の値を 1,000,000(100万) 用意して if / else でチェックします。後半部分では同じ数だけ object のインスタンスを用意します。用意する object は null でない値と null である値の数が、前半で用意した true / false の比に等しくなるようにしています。object についても if / else でチェックします。それぞれの処理時間を計測して、検証します。

        static void Main(string[] args)
        {

            //boolのとき
            bool[] boolArray = new bool[1000000];
            int trueCount = 0;
            int falseCount = 0;

            Random random = new Random();
            for (int i = 0; i < boolArray.Length; i++)
                if (random.Next(2) == 0)
                    boolArray[i] = true;

            Stopwatch stopwatch = new Stopwatch();
            stopwatch.Start();

            for (int i = 0; i < boolArray.Length; i++)
            {
                if (boolArray[i])
                    trueCount++;
                else
                    falseCount++;
            }

            stopwatch.Stop();
            
            Console.WriteLine(stopwatch.Elapsed.TotalMilliseconds + " msec");
            Console.WriteLine("true : " + trueCount + ", false : " + falseCount);


            //nullのとき(boolと同じ条件)
            object[] objectArray = new object[boolArray.Length];
            trueCount = 0;
            falseCount = 0;

            for (int i = 0; i < boolArray.Length; i++)
                if (boolArray[i]==true)
                    objectArray[i] = new object();

            stopwatch.Start();

            for (int i = 0; i < objectArray.Length; i++)
            {
                if (objectArray[i] != null)
                    trueCount++;
                else
                    falseCount++;
            }

            stopwatch.Stop();
            Console.WriteLine(stopwatch.Elapsed.TotalMilliseconds + " msec");
            Console.WriteLine("true : " + trueCount + ", false : " + falseCount);

            Console.ReadLine();
        }

検証結果

Windows-8, .NetFramework-4.5, Corei7(3.40GHz)環境下で実行した結果が次の通りです。何度か検証しましたが、少なくとも倍以上の結果が現れます。したがって扱うデータ量が多い、またはリアルタイム性が求められるようなプログラムを実装するときに、あるデータが存在するかどうかを検証する必要があるときは、そのデータが存在することを示すbool型のフィールド変数ないしプロパティを実装したほうが良さそうです。

8.1103 msec
true : 500017, false : 499983
22.7134 msec
true : 500017, false : 499983