c# - 为什么 DateTime.Parse 这么慢?

标签 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);

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

enter image description here

最佳答案

这不是一个公平的测试。

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

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

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

关于c# - 为什么 DateTime.Parse 这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12126169/

相关文章:

c# - VS 2012 MVC - 对更新和创建功能使用一个 View 和模型

.net - 你如何在 .NET 中提供 JSON 响应数据?

C# listview 子项不显示

python - str 包含 datetime64 pandas 的等价物

c# - 在 c# 中生成的代理类中列出 vs 数组

c# - 如何使用 C# 在 Redis 中添加对象列表作为键的值?

javascript - 使用 moment.js 更新提供的时间

r - 转换时间不适用于列的数据框

c# - 如何从 IQueryable<T> 获取原始集合

c# - WP7 : Type. GetMethods 抛出 MethodAccessException。这个错误有解决方法吗?