10

私はその遅さにショックを受けましたDateTime.Parse。このコードの実行には約100秒かかります。正規表現バージョンを使用する場合、100ミリ秒かかります。ここで何が起こっているのですか?

Stopwatch sw = new Stopwatch();
sw.Start();
var re = new Regex(@"(\d\d)/(\d\d)/(\d\d\d\d) (\d\d):(\d\d):(\d\d)", RegexOptions.Compiled);
for (int i = 0; i < 100000; i++)
{
    //var m = re.Match("08/01/2012 23:10:12");
    DateTime.Parse("08/01/2012 23:10:12", CultureInfo.CreateSpecificCulture("en-US"));
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);

編集:マークは正しいですCultureInfo.CreateSpecificCulture("en-US")、ループの外側に移動するのが助けになりました。私が以前にそれをしなかった理由は、私がこのコードをVS Profilerでプロファイリングしたところ、次の結果が表示されたためです。

ここに画像の説明を入力してください

4

1 に答える 1

30

それは公正なテストではありません。

  1. の呼び出しCultureInfo.CreateSpecificCulture("en-US")は遅い部分です。ループの外に移動し、結果を保存して再利用します。

  2. 正規表現は1つの特定の形式のみを処理しますが、DateTime.Parse多くの異なる入力形式を処理できます。理解する多くのフォーマットのどれが正しいものであるかを決定する必要があります。フォーマットが何であるかを事前に知っている場合は、のDateTime.ParseExact代わりに使用してDateTime.Parseください。

修正されたコードは次のとおりです。

CultureInfo ci = CultureInfo.CreateSpecificCulture("en-US");
for (int i = 0; i < 100000; i++)
{
    DateTime.ParseExact("08/01/2012 23:10:12", "MM/dd/yyyy HH:mm:ss", ci);
}

これらの2つの変更により、DateTime.ParseExactと正規表現のアプローチはほぼ同じであることがわかります。

また、正規表現は、などの無効な日時を受け入れます00/00/0000 99:99:99。有効な日時のみを受け入れるように修正すると、速度が低下します。

于 2012-08-25T22:36:55.587 に答える