Что быстрее: DateTime.TryParse или Regex - PullRequest
0 голосов
/ 22 июня 2011

В .NET, чтобы определить, является ли предоставленная строка датой, какая из них быстрее: с помощью DateTime для приведения ее к дате или с помощью регулярного выражения, чтобы проверить строку на предмет ее действительности в качестве даты?

Мне просто нужно убедиться, что введенное значение является датой, и я не буду ничего с этим делать потом.

Спасибо.

Ответы [ 5 ]

5 голосов
/ 22 июня 2011

Мой первый вопрос был бы более выразительным? Или какой самый читаемый? В таком случае, когда прирост производительности, вероятно, будет незначительным, я бы проголосовал за код, который проще всего поддерживать / читать.

EDIT

Нашел приличный, похожий пост. Стоит прочитать

Regex vs Tryparse, что является лучшим по производительности

4 голосов
/ 22 июня 2011

Хорошее регулярное выражение должно быть намного быстрее и, возможно, потреблять меньше временной памяти.

Но вот оборотная сторона медали:

Вы в значительной степени привязаны только к одному формату времениЭто означает, что интернационализация будет болезненной, и что ваши пользователи должны быть обучены вводить дату в правильном формате.

Кроме того, вы потеряете некоторую проверку даты, скажем, как вы отсеяли февраль29-й по не високосным годам?31 апреля?

2 голосов
/ 22 июня 2011

ОБНОВЛЕНИЕ: Когда работает на скрипке TryParse быстрее лот .

Я выполнил элементарный тест с 10000 элементов.Похоже, что регулярное выражение по крайней мере в два раза быстрее, чем 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;
    }
2 голосов
/ 22 июня 2011

Лучше всего написать немного тестового кода для обоих, а затем запустить цикл, чтобы сделать это миллион раз. Не зная ввода, было бы сложно ответить на это (хотя я думаю, что TryParse будет быстрее).

Тем не менее, разница во времени на современных процессорах, вероятно, не имеет значения.

1 голос
/ 22 июня 2011

В этом случае Regex работает быстрее, так как Regex будет искать только шаблоны, в которых при анализе DateTime потребуется найти шаблон, а также получить значения из этого шаблона для создания объекта DateTime

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...