Сравнение производительности цикла с переменными DateTime и integer в C#

Пример Найдите пятницу тринадцатые в C# , t действительно беспокоиться о производительности. Он использует целые числа для округления дат в пределах диапазона. За каждый год между датой начала и окончания код учитывает 13-е число каждого месяца в этом году. Затем он игнорирует любые месяцы до даты начала и заканчивает цикл, если он находит дату после даты окончания. Это короткий цикл, поэтому производительность не имеет большого значения.

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

Следующий код показывает, как этот пример сравнивает производительность двух типов циклов в диапазоне дат.

// Сравните два метода для циклирования по датам.
private void btnGo_Click(object sender, EventArgs e)
{
    txtDateTimeLoop.Clear();
    txtIntLoop.Clear();

    // Проверка переменных.
    DateTime loop_start_time;
    TimeSpan elapsed;
    bool test_bool;

    // Получаем компоненты начала и конца даты.
    DateTime start_date = dtpStart.Value.Date;
    DateTime end_date = dtpEnd.Value.Date;
    int start_year = start_date.Year;
    int end_year = end_date.Year;

    // *** Цикл с использованием переменных int. ***
    // Зацикливание за выбранные годы.
    loop_start_time = DateTime.Now;
    for (int year = start_year; year <= end_year; year++)
    {
        // Цикл в течение месяцев в году.
        for (int month = 1; month <= 12; month++)
        {
            // Посмотрим, будет ли в этом месяце 13-я пятница.
            DateTime test_date = new DateTime(year, month, 13);

            // Если мы не достигли даты начала, пропустите этот.
            if (test_date < start_date) continue;

            // Если мы закончили дату окончания, остановите цикл.
            if (test_date > end_date) break;

            // Смотрите, пятница.
            test_bool = (test_date.DayOfWeek == DayOfWeek.Friday);
        }
    }
    elapsed = DateTime.Now - loop_start_time;
    txtIntLoop.Text = elapsed.TotalSeconds.ToString("0.0000") + " secs";

    // *** Loop с использованием переменной DateTime. ***
    // Найдите первое 13-е число & gt; = start_date.
    DateTime loop_start =
        new DateTime(start_year, start_date.Month, 13);
    if (loop_start < start_date) loop_start.AddMonths(1);

    // Найдите последнее 13-е число & lt; = end_date.
    DateTime loop_end = new DateTime(end_year, end_date.Month, 13);
    if (loop_end > end_date) loop_end.AddMonths(-1);

    // Время первого цикла.
    loop_start_time = DateTime.Now;
    for (DateTime loop_date = loop_start;
        loop_date < loop_end;
        loop_date = loop_date.AddMonths(1))
    {
        test_bool = (loop_date.DayOfWeek == DayOfWeek.Friday);
    }
    elapsed = DateTime.Now - loop_start_time;
    txtDateTimeLoop.Text =
        elapsed.TotalSeconds.ToString("0.0000") + " secs";
}

Код создает некоторые переменные для записи начала и истекшего времени, а затем получает некоторую информацию о выбранных датах начала и окончания. Затем он использует целые числа для представления лет и месяцев в диапазоне дат и игнорирует любые даты, которые выходят за пределы диапазона. Дополнительную информацию о том, как работает этот цикл, см. В предыдущем примере .

Далее код вычисляет первый 13-й месяц, который больше или равен начальной дате и последнему 13-му месяцу до или равна конечной дате. Затем он использует переменную DateTime для циклирования по датам между началом 13-го и 13-м. После каждой итерации секция итерации цикла использует метод AddMonth переменной DateTime для добавления 1 месяца к переменной, заставляя ее перемещаться до 13 числа следующего месяца.

Источник: http://csharphelper.com/blog/2017/08/compare-performance-looping-over-datetime-and-integer-variables-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector