C# 哪个更快:DateTime.TryParse还是Regex

C# 哪个更快:DateTime.TryParse还是Regex,c#,.net,regex,datetime,C#,.net,Regex,Datetime,在.NET中,要确定提供的字符串是否是日期,哪个更快:使用DateTime将其转换为日期,还是使用正则表达式检查字符串作为日期的有效性 我只需要确保提供的值是一个日期,之后我不会对它做任何事情 谢谢。最好的办法是为两者都编写一些测试代码,然后运行一个循环来执行一百万次。在不知道输入的情况下,很难回答这个问题(尽管我猜测TryParse会更快) 这就是说,今天处理器上的时差可能无关紧要。在这种情况下,Regex似乎更快,因为Regex只会查找模式,其中as DateTime解析需要找到模式,并从该

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

我只需要确保提供的值是一个日期,之后我不会对它做任何事情


谢谢。

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


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

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

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

编辑

找到一个像样的类似职位。值得一读


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

但问题的另一面是:

您几乎只使用一种时间格式,这意味着国际化将是痛苦的,您的用户需要接受教育,以正确的格式输入日期

此外,你会失去一些日期验证,比如说,如何剔除非闰年的2月29日?4月31日?

更新:当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;
    }
private string[]arrDates=新字符串[10000];
受保护的无效页面加载(对象发送方、事件参数e)
{
初始化();
RunRegexDemo();
RunDateTimeParseDemo();
}
私有无效初始化()
{
随机ryear,rmonth,rdate;
ryear=新随机数();
rmonth=新随机数();
rdate=新随机数();
int y,m,d;
日期时间dt;
for(int i=0;i12)
{
m=第m次(12);
}
而(d<1 | | d>28)
{
d=下一个日期(28);
}
dt=新日期时间(y,m,d);
截止日期[i]=dt.ToString(“yyyy-MM-dd”);
//lbl1.Text+=“
”+arrDates[i]; } } 私有void RunRegexDemo() { System.Diagnostics.Stopwatch st=新的System.Diagnostics.Stopwatch(); lbl1.Text+=“正在启动正则表达式演示”; 字符串f; st.Start(); foreach(arrDates中的字符串x){ f=“
”+x+”是有效日期?=“+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+=“结束正则表达式演示。运行时间:”+st.elapsedmillyses; } 受保护的void RunDateTimeParseDemo(){ System.Diagnostics.Stopwatch st=新的System.Diagnostics.Stopwatch(); lbl1.Text+=“起始日期时间.解析演示”; st.Start(); 日期时间dt; 字符串f; foreach(arrDates中的字符串x) { f=“
”+x+”是有效日期吗?=“+DateTime.TryParse(x,out dt); } st.Stop(); lbl1.Text+=“结束了TryParse演示。运行时间:”+st.elapsedmillyses; }
为什么不测试一下呢?获取一组日期字符串,其中大约%无效,如果您或多或少知道它们的频率,则将它们扔向这两种方法并选择最快的。编写一个基准测试(或多个测试)。说真的,这是确保哪一个更快的唯一方法:编写一个5行基准测试,或者发布一个5行基准测试,然后等待其他人来做。这是一个来自
13.5K Rep
的人提出的一个非常奇怪的问题,当你说你需要“确保提供的值是日期”时,你是指有效的日期还是格式类似于日期的值?它必须是一个非常聪明和复杂的正则表达式,可以确定一个值是否实际上是一个有效日期。请检查固定提琴:缓存正则表达式每次都赢(紧张和不公正)谢谢!在我已修复的最后一个string.format参数列表中出现错误。