Другие упоминали Stopwatch
, что действительно хорошая идея. Однако у меня другой подход: я пытаюсь измерить алгоритм достаточно долго, чтобы нормальное разрешение системного таймера было адекватным. (Обычно я все еще использую Stopwatch
, так как это правильный тип для работы, но это не имеет значения.) Например, в моем недавнем тесте IO я беспокоюсь только о сообщайте секунды, потому что мои тесты занимают минуты (иногда полчаса). В этот момент миллисекунды неуместны, потому что они будут потеряны в шуме других процессов, прерывающих и т. Д.
Конечно, не всегда возможно проводить тесты так долго, но это приятно делать, где вы можете. Для более коротких тестов я бы с осторожностью относился к тестам, которые занимают менее 5 секунд ... короткая активность другого процесса может иметь непропорциональный эффект.
Еще одна вещь, которую следует учитывать - измерьте время процессора вместо времени стены:
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetProcessTimes(IntPtr hProcess,
out FILETIME lpCreationTime,
out FILETIME lpExitTime,
out ulong lpKernelTime,
out ulong lpUserTime);
static ulong GetTime(Process process)
{
FILETIME lpCreationTime, lpExitTime;
ulong lpKernelTime, lpUserTime;
GetProcessTimes(process.Handle, out lpCreationTime,
out lpExitTime, out lpKernelTime, out lpUserTime);
return lpKernelTime + lpUserTime;
}