Результат: ученик различает календарный момент, длительность и монотонно измеренное прошедшее время, выполняет безопасную временную арифметику и строит воспроизводимый протокол измерения программного участка.

Содержание:

  1. Различить временные величины

    • DateTime как календарный момент;
    • TimeSpan как знаковая длительность;
    • Stopwatch как измеритель прошедшего времени;
    • момент плюс длительность;
    • разность двух моментов;
    • невозможность использовать календарные часы как точную замену монотонному измерителю.
  2. Создавать и сравнивать календарные моменты

    • конструкторы DateTime;
    • компоненты даты и времени;
    • DateTimeKind;
    • согласованная временная шкала внутри задачи;
    • операторы сравнения;
    • устойчивый строковый формат.
  3. Работать с TimeSpan

    • создание из дней, часов, минут, секунд, миллисекунд и тактов;
    • компоненты Days, Hours, Minutes, Seconds;
    • полные величины TotalDays, TotalHours, TotalSeconds;
    • TimeSpan.Zero;
    • положительная, нулевая и отрицательная длительность;
    • целочисленное усечение при работе с тактами.
  4. Строить интервалы и расписания

    • полуоткрытый интервал [start, end);
    • касание и пересечение;
    • объединение занятых интервалов;
    • свободные промежутки;
    • периодические точки;
    • пиковая одновременность;
    • представимость результата в диапазоне DateTime.
  5. Получать согласованный снимок текущего времени

    • DateTime.Now и DateTime.UtcNow по назначению;
    • один вызов как основа одного отчёта;
    • изменение времени между независимыми вызовами;
    • непригодность фактического текущего момента как фиксированного тестового ожидания.
  6. Управлять жизненным циклом Stopwatch

    • Start, Stop, Reset и Restart;
    • IsRunning;
    • накопление после повторного Start;
    • Elapsed, ElapsedMilliseconds и ElapsedTicks;
    • показание во время работы и после остановки.
  7. Различать две шкалы тактов

    • TimeSpan.TicksPerSecond;
    • Stopwatch.Frequency;
    • перевод ElapsedTicks в секунды;
    • Elapsed.Ticks как такты TimeSpan;
    • ошибка прямого использования TimeSpan.FromTicks(stopwatch.ElapsedTicks).
  8. Изолировать измеряемый участок

    • подготовка входа вне таймера;
    • прогрев;
    • исключение вывода и форматирования;
    • проверка результата после остановки;
    • контрольная сумма, делающая результат наблюдаемым;
    • восстановление изменяемого входа между повторами.
  9. Проектировать серию измерений

    • Release без подключённого отладчика;
    • фиксированная версия среды и параметры компьютера;
    • одинаковые входы;
    • чередование порядка сравниваемых алгоритмов;
    • несколько размеров;
    • достаточное число повторов;
    • предел слишком дорогой серии.
  10. Описывать распределение замеров

    • минимум;
    • медиана;
    • среднее;
    • максимум;
    • размах и относительный размах;
    • нулевые измерения и разрешение таймера;
    • отказ от автоматического удаления медленных повторов без правила.
  11. Сопоставлять время с числом операций

    • счётчик сравнений и перемещений;
    • лучший, средний и худший случаи;
    • нормировки t / n, t / (n log n) и t / n²;
    • постоянные накладные расходы;
    • пакетирование слишком короткой операции;
    • границы вывода по измеренному диапазону.
  12. Аудировать методику

    • один запуск;
    • Debug под отладчиком;
    • разные входы;
    • повторная обработка изменённого массива;
    • смешение ядра и полной стратегии;
    • неверная единица времени;
    • объявление одного размера доказательством асимптотики.