我对 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);
编辑:Mark 是对的,将 CultureInfo.CreateSpecificCulture("en-US")
移到循环外很有帮助。我之前没有这样做的原因是我使用 VS Profiler 分析了这段代码,它显示了以下结果:
最佳答案
这不是一个公平的测试。
对
CultureInfo.CreateSpecificCulture("en-US")
的调用是缓慢的部分。将其移出循环,存储结果并重复使用。您的正则表达式只能处理一种特定格式,但
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);
}
通过这两个更改,我发现 DateTime.ParseExact
和正则表达式方法几乎相同。
并且您的正则表达式接受一些无效的日期时间,例如 00/00/0000 99:99:99
。如果您修复它以便它只接受有效的日期时间,它会变慢。
关于c# - 为什么 DateTime.Parse 这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12126169/