同事在处理大量数据的转档,项目用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对性能的影响