あるプログラムの性能調査をしていて、今更ながらリファレンスは読むべきだなぁ、
と思ったことを記載します。
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 より)
とのこと。納得です。
文字列比較系のメソッドを 速度が求められるシーンで使う際には、注意しましょう。