布団が俺を呼んでいる

丘山大一のぶろぐ

空文字を判定する最も効率のいいやり方は? (C#i編)

というわけでC#編。

ソース(前回書かなかったな)

効率のいい書き方?作法?そんなん知らんがな(邪悪)。

    class Program
    {
        static void Main(string[] args)
        {
            using (StreamWriter sw = new StreamWriter(@"D:\test.txt", true, System.Text.Encoding.Unicode))
            {
                Console.SetOut(sw);

                string s = string.Empty;
                var result = new List<TimeSpan>();

                var tryCounter = Enumerable.Range(1, 10).ToList();
                var roopCounter = Enumerable.Range(0, 10000000).ToList();

                Console.WriteLine(@"""""での判定");
                result.Clear();
                tryCounter.ForEach(i =>
                {
                    Console.Write(i + "回目:");
                    Console.WriteLine(
                    RunText(() =>
                    {
                        roopCounter.ForEach(r =>
                        {
                            if (s == "") { };
                        });
                    }));
                });

                Console.WriteLine(@"String.Emptyでの判定");
                result.Clear();
                tryCounter.ForEach(i =>
                {
                    Console.Write(i + "回目:");
                    Console.WriteLine(
                    RunText(() =>
                    {
                        roopCounter.ForEach(r =>
                        {
                            if (s == string.Empty) { };
                        });
                    }));
                });

                Console.WriteLine(@"String.IsNullorEmptyでの判定");
                result.Clear();
                tryCounter.ForEach(i =>
                {
                    Console.Write(i + "回目:");
                    Console.WriteLine(
                    RunText(() =>
                    {
                        roopCounter.ForEach(r =>
                        {
                            if (string.IsNullOrEmpty(s)) { };
                        });
                    }));
                });

                Console.WriteLine(@"Lengthでの判定");
                result.Clear();
                tryCounter.ForEach(i =>
                {
                    Console.Write(i + "回目:");
                    Console.WriteLine(
                    RunText(() =>
                    {
                        roopCounter.ForEach(r =>
                        {
                            if (s.Length == 0) { };
                        });
                    }));
                });

                Console.WriteLine(@"""""とequlsでの判定");
                result.Clear();
                tryCounter.ForEach(i =>
                {
                    Console.Write(i + "回目:");
                    Console.WriteLine(
                    RunText(() =>
                    {
                        roopCounter.ForEach(r =>
                        {
                            if (s.Equals("")) { };
                        });
                    }));
                });

                sw.Close();
            }
        }

        static TimeSpan RunText(Action a)
        {
            var t = DateTime.Now;
            a();
            return DateTime.Now - t;
        }
    }

結果

""での判定
1回目:00:00:00.1810066
2回目:00:00:00.1560072
3回目:00:00:00.1440069
4回目:00:00:00.1290084
5回目:00:00:00.1630423
6回目:00:00:00.1779770
7回目:00:00:00.1580394
8回目:00:00:00.1800101
9回目:00:00:00.1579818
10回目:00:00:00.1810102

String.Emptyでの判定
1回目:00:00:00.1690038
2回目:00:00:00.1430068
3回目:00:00:00.1370051
4回目:00:00:00.1190062
5回目:00:00:00.1190067
6回目:00:00:00.1090028
7回目:00:00:00.1030062
8回目:00:00:00.1020050
9回目:00:00:00.0900034
10回目:00:00:00.0890046

String.IsNullorEmptyでの判定
1回目:00:00:00.0770039
2回目:00:00:00.0740020
3回目:00:00:00.0680047
4回目:00:00:00.0670034
5回目:00:00:00.0720012
6回目:00:00:00.0670210
7回目:00:00:00.0619853
8回目:00:00:00.0610202
9回目:00:00:00.0610032
10回目:00:00:00.0600027

Lengthでの判定
1回目:00:00:00.0510044
2回目:00:00:00.0469995
3回目:00:00:00.0460022
4回目:00:00:00.0460020
5回目:00:00:00.0460034
6回目:00:00:00.0460022
7回目:00:00:00.0460020
8回目:00:00:00.0460016
9回目:00:00:00.0420017
10回目:00:00:00.0420029

""とequlsでの判定
1回目:00:00:00.0640032
2回目:00:00:00.0640030
3回目:00:00:00.0630028
4回目:00:00:00.0590029
5回目:00:00:00.0590028
6回目:00:00:00.0580030
7回目:00:00:00.0590032
8回目:00:00:00.0580030
9回目:00:00:00.0560021
10回目:00:00:00.0540025

総括

おおむねこの通りでした。
とりあえず「文字列 == 空」のような書き方はアカンということが分かった。
DelphiとC#は、開発者レベルで似ている(というか同……ゲフンゲフン)ですけど、結果が大分違うのが面白いですね。

※注意!

私の開発環境での結果です。
ロジックや書き方、環境によってなんぼでも結果は変わることをお断りしておきます。


C#実践開発手法 (マイクロソフト公式解説書)

新品価格
¥5,400から
(2016/5/22 17:14時点)

コメントを書く