Как отобразить точное время для тестирования производительности номера в C # - PullRequest
3 голосов
/ 25 марта 2009

Я хочу проверить скорость алгоритма, какая перегрузка DateTime даст мне самое точное время? (Мне все еще нужны день / месяц / год / секунды, но затем мне также нужны миллисекунды).

Ответы [ 5 ]

11 голосов
/ 25 марта 2009

Попробуйте использовать System.Diagnostics.Stopwatch, чтобы сделать это:

http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

4 голосов
/ 25 марта 2009

Другие упоминали 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;
   }
1 голос
/ 25 марта 2009

Когда вы вычитаете две DateTime структуры, вы получаете TimeSpan структуру. Используя TimeSpan, вы можете получить интервал между двумя значениями.

var before = DateTime.Now;
System.Threading.Thread.Sleep(6500);
var after = DateTime.Now;

var timeTaken = after - before;
var secondsTaken = timeTaken.TotalSeconds;
var milisecondsTaken = timeTaken.TotalMiliseconds;

Обратите внимание, что вы должны использовать TotalXXXX, чтобы получить все XXXX, иначе это будет больше похоже на то, что хочет человек. В этом случае timeTaken.Seconds = 5, но timeTaken.TotalSeconds = 65.

1 голос
/ 25 марта 2009

Как насчет использования DateTime.Now.Ticks?

Сохраните значение, запустите алгоритм, сравните сохраненное значение с текущим значением и получите количество тактов, которое потребовалось для запуска алгоритма.

0 голосов
/ 25 марта 2009

Вот пример кода для использования класса System.Diagnostics.Stopwatch:

Stopwatch sw = Stopwatch.StartNew();
// Put the code here that you want to time
sw.Stop();
long elapsedTime = sw.ElapsedMilliseconds;

DateTime.Ticks точен только с точностью до 15 мс, поэтому не идеален для коротких алгоритмов синхронизации.

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