为什么DateTime.Parse这么慢?

时间:2012-08-25 22:34:20

标签: c# .net datetime

我对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对此代码进行了分析,结果显示以下结果:

enter image description here

1 个答案:

答案 0 :(得分:26)

这不是一个公平的考验。

  1. CultureInfo.CreateSpecificCulture("en-US")的调用是缓慢的。将其移出循环,存储结果并重复使用。

  2. 您的正则表达式只处理一种特定格式,但DateTime.Parse可以处理许多不同的输入格式。它必须决定它理解的许多格式中哪一个是正确的格式。如果您事先知道格式是什么,请使用DateTime.ParseExact代替DateTime.Parse

  3. 固定代码如下:

    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);
    }
    

    通过这两个更改,我得到DateTime.ParseExact和正则表达式方法几乎相同。

    您的正则表达式接受一些无效的日期时间,例如00/00/0000 99:99:99。如果你修复它以便它只接受有效的日期时间,那就会慢一些。