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

Joh*_*ohn 1 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()); 
    
    Run Code Online (Sandbox Code Playgroud)

- >输出: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()); 
    
    Run Code Online (Sandbox Code Playgroud)

- >输出:11,6秒真的很慢!!!

两个问题.

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

2 - 我可以使用什么替代解决方案在datetime中使用US-Culture转换字符串

Ste*_*eve 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Gui这不仅仅是CultureInfo.您应该假设创建*any*对象很昂贵.不要再使用`new`关键字了! (2认同)