布団が俺を呼んでいる

丘山大一のぶろぐ

空文字を判定する最も効率のいいやり方は? (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時点)

コメントを書く

布団が俺を呼んでいる | VRでB規格サイズの紙が無くなるのではないかと想像する

布団が俺を呼んでいる

丘山大一のぶろぐ

VRでB規格サイズの紙が無くなるのではないかと想像する

想像というか妄想シリーズ。
kindle unlimitedも開始されました。

VR上で、「紙」の規格が統一されるのではないか?

先に「本」の規格が統一されるのではないか? というエントリを書きましたが、当然その前に「紙」の規格ができるはずです。
なぜなら、複数の紙が重なった本を表現するよりも、単一の紙を表現する方が簡単だからです。
フツーに考えて、簡単な規格から模索・策定されるでしょう。
さて、その時どの紙から規格化されるのか、と考えたとき、もっともA規格だと思われます。
国際標準規格らしいですし、実物の紙をトレースするならまずこれをベースにするでしょう。
で、おそらく、拡大・縮小表示するにしても、「A規格サイズをベースに」拡大・縮小するようになるのではないかと想像するわけです。
そうすると、「現物の紙を取り込んでVRで見る」あるいは「VRのデータを紙で出力する」ということをすることになった場合、「A規格サイズ」とくにA4をベースにアプリケーションが開発されるのではないでしょうか。
そうなってくると、データのやり取りが「A4サイズデータでくれ」みたいになる気がします。
逆に、なんぼ日本人になじみがあろうとも、世界的にマイナーな「B5」なんてサイズをベースにするメリットは小さいです。いや、むしろネックになりかねません。
VRによって駆逐された最初のものは、まさかの紙の規格であった……なーんてことになるかと想像しました。


そして最終的には

さらに、「VR上ではA4サイズで表示する」みたいな規格が世界なんちゃら組織とかで決定し、
さらにその後、さながらWeb業界のXMLとJSONのごとく全く別の規格がデファクトスタンダードになっちゃうことまで想像した。



コクヨ PPC用紙 共用紙 FSC認証 64G B5 500枚 KB-35N

新品価格
¥402から
(2016/4/20 22:45時点)

コメントを書く