为什么DateTime.Parse这么慢?

And*_*rey 10 .net c# 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);
Run Code Online (Sandbox Code Playgroud)

编辑:马克是对的,移动CultureInfo.CreateSpecificCulture("en-US")外面的循环帮助.之前我没有这样做的原因是我用VS Profiler分析了这段代码,它显示了以下结果:

在此输入图像描述

Mar*_*ers 26

这不是一个公平的考验.

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

  2. 您的正则表达式只处理一种特定格式,但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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • 噢,我感觉很愚蠢,实际上将“ CreateSpecificCulture”移出了循环固定性能。我之所以没有这样做的原因是因为我使用了VS Profiler,它表明问题出在“解析”中,请参见编辑中的屏幕截图。 (2认同)