为什么DateTime.TryParse与文化US和AdjustToUniversal一样慢

时间:2013-06-21 22:47:36

标签: c#

这是两个测试, 第一个使用:

  • DateTime.TryParse(dateToParse,out date)

        var dateToParse = "2012-09-17";
    
        var startNew = Stopwatch.StartNew();
        for (int i = 0; i < 4059; i++)
        {
            DateTime date;
            if (!DateTime.TryParse(dateToParse, out date))
                continue;
    
    
        }
        Console.WriteLine(startNew.GetTimeString()); 
    

- &GT;输出:19,1 ms 快速闪电

第二个使用:

  • DateTime.TryParse(dateToParse,new CultureInfo(“en-US”),DateTimeStyles.AdjustToUniversal,out date)

        var dateToParse = "2012-09-17";
    
        var startNew = Stopwatch.StartNew();
        for (int i = 0; i < 4059; i++)
        {
            DateTime date;
            if (!DateTime.TryParse(dateToParse, new CultureInfo("en-US"), DateTimeStyles.AdjustToUniversal, out date))
                continue;
    
    
        }
        Console.WriteLine(startNew.GetTimeString()); 
    

- &GT;输出:11,6秒真的很慢!!!

两个问题。

1 - 为什么在美国文化中转换如此缓慢

2 - 我可以使用哪种替代解决方案将日期时间字符串转换为US-Culture

2 个答案:

答案 0 :(得分:6)

一点优化

var dateToParse = "2012-09-17";

CultureInfo ci = new CultureInfo("en-US");
var startNew = Stopwatch.StartNew();
for (int i = 0; i < 4059; i++)
{
    DateTime date;
    if (!DateTime.TryParse(dateToParse, ci, DateTimeStyles.AdjustToUniversal, out date))
        continue;
}

第一个例子和第二个例子之间的区别在于新的CultureInfo 在进入循环之前只创建一次将大大减少所需的时间。

但是,我很想知道在IDE之外编译和执行时原始代码的真实性能。 JITter可能会自行进行优化。

答案 1 :(得分:4)

这是因为您正在创建4059个对象 - 特别是在new CultureInfo("en-US")位。

在循环之外声明US CultureInfo对象。