[.NET][C#]大量New CultureInfo对性能的影响

同事在处理大量数据的转档,项目用C#读取大量文字文件,读取后要做基本字段检核,因为程序处理速度较慢(10万笔20分钟),于是帮忙同事一起抓原因。花了几个小时后,发现重复New CultureInfo 对性能带来巨大的影响,快来笔记。


日期字段的检核:

通常我们会用Datetime.TryParse或DateTime.TryParseExact这两种方法检核并输出日期值。

*两者差别在输入的日期字符串是否为标准的格式(ISO8601),当字符串可能是非标准的格式时,程序可以会使用Datetime.TryParseExact指定格式。

DateTime.TryParseExact(
"20150709", 
"yyyyMMdd", 
new CultureInfo("zh-TW", true), 
DateTimeStyles.None, 
out dteDTE)

*yyyyMMdd是ISO8601标准的格式,其实用TryParse也可以。

参数说明:

其中第3个参数要输入System.Globalization下的文化特性类CultureInfo

这边的写法如果执行1次影响并不大,但因为这个段落要重复执行100万次以上,时间就很漫长,来执行10万次比较:

1.执行10万次new CultureInfo (Datetime.TryParseExact)

[TestMethod]
public void TestMethod1()
{
    Stopwatch sw = new Stopwatch();
    sw.Start();
    for (int i = 0; i < 100000; i++)
    {
        DateTime dteDTE = new DateTime();
        if (DateTime.TryParseExact("20150709", "yyyyMMdd", new CultureInfo("zh-TW", true), DateTimeStyles.None, out dteDTE))
        {
            continue;
        }
    }
    sw.Stop();
    Console.WriteLine(String.Format("总计时间:{0}毫秒", (sw.ElapsedMilliseconds).ToString()));
}

2.只执行1次new CultureInfo (Datetime.TryParseExact)

[TestMethod]
public void TestMethod2()
{
    CultureInfo culTW = new CultureInfo("zh-TW", true);
    Stopwatch sw = new Stopwatch();
    sw.Start();
    for (int i = 0; i < 100000; i++)
    {
        DateTime dteDTE = new DateTime();
        if (DateTime.TryParseExact("20150709", "yyyyMMdd", culTW, DateTimeStyles.None, out dteDTE))
        {
            continue;
        }
    }
    sw.Stop();
    Console.WriteLine(String.Format("总计时间:{0}毫秒", (sw.ElapsedMilliseconds).ToString()));
}

3.单纯用Datatime.TryPasre

[TestMethod]
public void TestMethod3()
{

    Stopwatch sw = new Stopwatch();
    sw.Start();
    for (int i = 0; i < 100000; i++)
    {
        DateTime dteDTE = new DateTime();
        if (DateTime.TryParse("20150709",out dteDTE))
        {
            continue;
        }
    }
    sw.Stop();
    Console.WriteLine(String.Format("总计时间:{0}毫秒", (sw.ElapsedMilliseconds).ToString()));
}

#Set ms
TryParseExact (new 10万次 CultureInfo ) 32995
TryParseExact  (new 1次 CultureInfo ) 29
TryParse 20

小结:

  • 32995ms vs 29ms,揉眼睛,真的没看错!是1,000倍,这个比半泽直树最终回百倍返しだ!(百倍奉还)还强!
  • 预计要转200万笔数据,33s * 20单位事务量 * 20个日期字段 / 8t = 1650秒 ≃ 30分钟节省
  • 选Datetime.TryParse或Datetime.TryParseExact都很快,只要不要选Datetime.Parse! 在转换失败时,性能会差很多。
  • 20150709是女儿生日。

参考:

CultureInfo 类

C# - new CultureInfo instantiation performance

DateTime方法

原文:大专栏  [.NET][C#]大量New CultureInfo对性能的影响


猜你喜欢

转载自www.cnblogs.com/chinatrump/p/11458388.html