Можно ли использовать секундомер в рабочем коде? - PullRequest
73 голосов
/ 10 мая 2010

Мне нужен точный таймер, а DateTime.Now кажется недостаточно точным. Из описаний, которые я прочитал, System.Diagnostics.Stopwatch кажется именно тем, что я хочу.

Но у меня фобия. Я нервничаю по поводу использования чего-либо из System.Diagnostics в реальном производственном коде. (Я широко использую его для отладки с помощью Asserts, PrintLns и т. Д., Но еще никогда не использую для производства.) Я не просто пытаюсь использовать таймер для сравнения моих функций - моему приложению нужен реальный таймер. Я читал на другом форуме, что System.Diagnostics.StopWatch предназначен только для бенчмаркинга и не должен использоваться в розничном коде, хотя причина не указана. Правильно ли это, или я (и тот, кто опубликовал этот совет) слишком закрыт для системной диагностики? то есть можно ли использовать System.Diagnostics.Stopwatch в производственном коде? Спасибо Адриан

Ответы [ 7 ]

57 голосов
/ 10 мая 2010

Под капотом практически все, что делает секундомер, - это обертка QueryPerformanceCounter . Насколько я понимаю, секундомер предназначен для доступа к таймеру высокого разрешения - если вам нужно это разрешение в рабочем коде, я не вижу ничего плохого в его использовании.

23 голосов
/ 10 мая 2010

Да, System.Diagnostics звучит так, как будто только для отладки, но не позволяйте имени обмануть вас. Пространство имен System.Diagnostics может показаться немного пугающим для использования в производственном коде сначала (это было для меня), но в этом пространстве имен есть много полезных вещей.

Некоторые вещи, такие как класс Process, полезны для взаимодействия с системой. С помощью Process.Start вы можете запускать другие приложения, запускать веб-сайт для пользователя, открывать файл или папку и т. Д.

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

Не беспокойтесь об имени.

5 голосов
/ 10 мая 2010

Вы говорите, что читали на другом форуме, чтобы не использовать классы System.Diagnostics в производстве.Но единственный источник, о котором вы должны беспокоиться - это Microsoft, создавший код.Они говорят, что StopWatch класс :

Предоставляет набор методов и свойств, которые можно использовать для точного измерения прошедшего времени.

Они не говорят «кроме как на производстве».

4 голосов
/ 10 мая 2010

Afaik StopWatch - это оболочка над QueryPerformanceCounter функциональностью. Эта функция является основой многих измерений, связанных со счетчиками производительности. QPF очень быстро звонит и абсолютно безопасен. Если вы чувствуете себя параноиком по поводу пространства имен Diagnostics, немедленно вызовите QPF.

3 голосов
/ 10 мая 2010

В библиотеке базовых классов .NET есть несколько различных классов таймеров - какой из них лучше всего подходит для ваших нужд, определяется только вами.

Вот хорошая статья из журнала MSDN на эту тему (Сравнение классов таймеров в библиотеке классов .NET Framework).

3 голосов
/ 10 мая 2010

Секундомер , в основном аккуратная оболочка вокруг нативных QueryPerformanceCounter и QueryPerformanceFrequency методов. Если вам неудобно использовать пространство имен System.Diagnostic, вы можете получить к ним прямой доступ .

Использование счетчика производительности очень распространено, в этом нет ничего плохого. AFAIK, нет более высокой точности таймера. Обратите внимание, что QPF может привести к проблемам с многопроцессорными машинами, но в статье MSDN, указанной ранее, содержится дополнительная информация об этом. Желательно убедиться, что System.Diagnostics.Stopwatch делает это в фоновом режиме, или вызвать SetThreadAffinity вручную, иначе ваш таймер может отскочить назад во времени !

Обратите внимание, что для измерений с очень высокой точностью есть некоторые тонкости , которые необходимо учитывать. Если вам нужна такая большая точность, это может вызвать некоторую обеспокоенность.

0 голосов
/ 10 мая 2010

В зависимости от того, для чего вы используете таймер, у вас могут возникнуть другие проблемы. Windows не предоставляет гарантий по срокам выполнения, поэтому вам не следует полагаться на нее при обработке в реальном времени (есть расширения для реального времени, которые вы можете получить для Windows, которые обеспечивают жесткое планирование в реальном времени). Я также подозреваю, что вы можете потерять точность в результате переключения контекста после захвата временного интервала и до того, как вы что-то сделаете с ним, что зависит от его точности. В принципе, это может быть произвольно длительный период времени; на практике это должно быть порядка миллисекунд. Это действительно зависит от того, насколько важным является это время.

...