DateTime.Now лучший способ измерить производительность функции? - PullRequest
457 голосов
/ 26 августа 2008

Мне нужно найти узкое место и нужно максимально точно измерить время.

Является ли следующий фрагмент кода лучшим способом измерения производительности?

DateTime startTime = DateTime.Now;

// Some execution process

DateTime endTime = DateTime.Now;
TimeSpan totalTimeTaken = endTime.Subtract(startTime);

Ответы [ 15 ]

6 голосов
/ 25 октября 2008

Visual Studio Team System имеет некоторые функции, которые могут помочь в решении этой проблемы. По сути, вы можете писать модульные тесты и смешивать их в различных сценариях, чтобы запускать их против вашего программного обеспечения в рамках стресс-теста или нагрузочного теста. Это может помочь определить области кода, которые больше всего влияют на производительность ваших приложений.

Группа Microsoft "Шаблоны и практики" содержит некоторые рекомендации в Руководство по тестированию производительности системы Visual Studio Team .

5 голосов
/ 09 октября 2008

Я только что нашел сообщение в блоге Вэнса Моррисона о классе CodeTimer , который он написал, который облегчает использование StopWatch и делает некоторые полезные вещи на стороне.

4 голосов
/ 14 сентября 2014

Это недостаточно профессионально:

Stopwatch sw = Stopwatch.StartNew();
PerformWork();
sw.Stop();

Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);

Более надежная версия:

PerformWork();

int repeat = 1000;

Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < repeat; i++)
{
   PerformWork();
}

sw.Stop();

Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds / repeat);

В своем реальном коде я добавлю вызов GC.Collect для изменения управляемой кучи в известное состояние и добавлю вызов режима ожидания, чтобы различные интервалы кода можно было легко разделить в профиле ETW.

4 голосов
/ 18 июля 2014

В своих программах я использую класс StopWatch, как показано здесь.

Stopwatch sw = new Stopwatch();
sw.Start();


// Critical lines of code

long elapsedMs = sw.Elapsed.TotalMilliseconds;
4 голосов
/ 26 августа 2008

Я очень мало проверил такого рода проверку производительности (я склонен думать, что «это медленно, сделайте это быстрее»), поэтому я почти всегда с этим справлялся.

Google показывает много ресурсов / статей для проверки производительности.

Многие упоминают об использовании pinvoke для получения информации о производительности. Множество материалов, которые я изучаю, только упоминают об использовании perfmon ..

Edit:

Видел разговоры о StopWatch .. Отлично! Я кое-что узнал:)

Это похоже на хорошую статью

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