あるプログラムの性能調査をしていて、今更ながらリファレンスは読むべきだなぁ、
と思ったことを記載します。

StartsWith() より Contains() の方が速い?

public static void Main()
{
    string s = "あいうえお";
    string t = "あい";
    for (int i = 0; i < 10000000; i++)
    {
        bool b = s.StartsWith(t);
    }
}

このプログラムは、自分の環境では、【2,095msec】かかります。
ところが Contains() メソッドを使うと、【720msec】で実行できます。
Contains() の方が、先頭だけでなく途中も検査しなければならないので、
遅くなるだろうと思っていたので、結果に少し驚きました。

MSDNリファレンスを確認したところ、次の記載があることに気が付きました。

StartsWith()
このメソッドは、現在のカルチャを使用して、単語 (大文字小文字を区別やカルチャ) 比較を実行します。
Contains()
このメソッドは、序数に基づく (大文字小文字を区別とカルチャに依存しない) 比較を実行します。

StartsWith() を速くする

ならば、カルチャを使用しない方法で StartsWith() を使えば速くなるのではないか、
ということで以下のようにしてみました。

bool b = s.StartsWith(t, System.StringComparison.Ordinal);

結果は、【161msec】と非常に速くなりました。

下記のサイトによると、Ordinal は

非言語的な比較が行われ、自然言語の特性は無視されます。
(https://msdn.microsoft.com/ja-jp/library/dd465121(v=vs.110).aspx より)

とのこと。納得です。
文字列比較系のメソッドを 速度が求められるシーンで使う際には、注意しましょう。

TOP
TOP