1

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

  • 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()); 
    

-> 输出:19.1 毫秒闪电般的速度

第二个使用:

  • 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()); 
    

-> 输出:11.6 秒真的很慢!!!

两个问题。

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

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

4

2 回答 2

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 可能会自己进行这种优化。

于 2013-06-21T22:51:37.107 回答
4

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

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

于 2013-06-21T22:51:30.923 回答