哪个更快:DateTime.TryParse或Regex

在.NET中,要确定提供的字符串是否为日期,哪一个更快:使用DateTime将其强制转换为日期,还是使用正则表达式检查字符串的有效性作为日期?

我只需要确保提供的值是一个日期,之后我没有做任何事情。

谢谢。

一个好的正则表达式应该更快,并且可能消耗更少的瞬态内存。

但这是硬币的另一面:

你只相当于一种时间格式,这意味着国际化将是痛苦的,并且你的用户需要接受教育,以正确的格式输入日期。

此外,你会失去一些日期validation,比如说,你如何在非闰年2月29日淘汰? 4月31日?

我的第一个问题是哪个更具表现力? 或哪个最具可读性? 在这样的情况下,性能提升可能可以忽略不计,我会投票选出最容易维护/读取的代码。

编辑

找到一个体面的,类似的post。 值得一读

Regex vs Tryparse性能最佳

最好的办法是为两者编写一些测试代码,然后运行一个循环来做一百万次。 在不知道输入的情况下,很难回答这个问题(虽然我的猜测是TryParse会更快)。

也就是说,今天处理器的时差可能无关紧要。

更新:当在小提琴中运行时, TryParse会更快。

我用10000件物品进行了初步测试。 看起来Regexp的速度至少是DateTime.Parse的两倍。 请参阅以下代码:

  private string[] arrDates = new string[10000]; protected void Page_Load(object sender, EventArgs e) { initialise(); RunRegexDemo(); RunDateTimeParseDemo(); } private void initialise() { Random ryear, rmonth, rdate; ryear = new Random(); rmonth = new Random(); rdate = new Random(); int y, m, d; DateTime dt; for (int i = 0; i < arrDates.Length; i++) { y = 0; m = 0; d = 0; while (y < 1850) { y = ryear.Next(2050); } while (m < 1 || m > 12) { m = rmonth.Next(12); } while (d < 1 || d > 28) { d = rdate.Next(28); } dt = new DateTime(y, m, d); arrDates[i] = dt.ToString("yyyy-MM-dd"); //lbl1.Text += "
" + arrDates[i]; } } private void RunRegexDemo() { System.Diagnostics.Stopwatch st = new System.Diagnostics.Stopwatch(); lbl1.Text+= "

Starting Regex demo

"; string f; st.Start(); foreach(string x in arrDates){ f= "
" + x + " is a valid date? = " + System.Text.RegularExpressions.Regex.IsMatch(x, @"^(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$"); } st.Stop(); lbl1.Text+= "

Ended RegEx demo. Elapsed time: " + st.ElapsedMilliseconds; } protected void RunDateTimeParseDemo(){ System.Diagnostics.Stopwatch st = new System.Diagnostics.Stopwatch(); lbl1.Text += "

Starting DateTime.Parse demo

"; st.Start(); DateTime dt; string f; foreach (string x in arrDates) { f = "
" + x + " is a valid date? = " + DateTime.TryParse(x, out dt); } st.Stop(); lbl1.Text += "

Ended TryParse demo. Elapsed time: " + st.ElapsedMilliseconds; }

在这种情况下正则表达式似乎更快,因为Regex只会查找模式,其中DateTime解析需要找到模式以及从该模式中获取值以创建DateTime对象