哪个更快:DateTime.TryParse或Regex

时间:2011-06-22 11:41:11

标签: c# .net regex datetime

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

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

感谢。

5 个答案:

答案 0 :(得分:5)

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

修改

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

Regex vs Tryparse what is the best in performance

答案 1 :(得分:4)

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

但这是硬币的另一面:

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

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

答案 2 :(得分:2)

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

尽管如此,今天处理器的时差可能无关紧要。

答案 3 :(得分:2)

更新:当run in a fiddle 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 += "<br />" + arrDates[i];
        }

    }

    private void RunRegexDemo()
    {
        System.Diagnostics.Stopwatch st = new System.Diagnostics.Stopwatch();
        lbl1.Text+= "<h4>Starting Regex demo</h4>";
        string f;

        st.Start();

        foreach(string x in arrDates){
            f= "<br/>" + 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+= "<p>Ended RegEx demo. Elapsed time: " + st.ElapsedMilliseconds;
    }


    protected void RunDateTimeParseDemo(){
        System.Diagnostics.Stopwatch st = new System.Diagnostics.Stopwatch();
        lbl1.Text += "<h4>Starting DateTime.Parse demo</h4>";
        st.Start();
        DateTime dt;
        string f;
        foreach (string x in arrDates)
        {
            f = "<br/>" + x + " is a valid date? = " + DateTime.TryParse(x, out dt);
        }

        st.Stop();
        lbl1.Text += "<p>Ended TryParse demo. Elapsed time: " + st.ElapsedMilliseconds;
    }

答案 4 :(得分:1)

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