Секундомер может использоваться в производственном коде?

Мне нужны точный таймер и DateTime. Теперь кажется не достаточно точным. Из описаний я читал, Система. Диагностика. Секундомер, кажется, точно, что я хочу.

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

74
задан Adrian 10 May 2010 в 18:30
поделиться

7 ответов

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

60
ответ дан 24 November 2019 в 12:03
поделиться

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

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

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

5
ответ дан 24 November 2019 в 12:03
поделиться

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

Вот хорошая статья из журнала MSDN на эту тему (Comparing the Timer Classes in the .NET Framework Class Library).

3
ответ дан 24 November 2019 в 12:03
поделиться

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

0
ответ дан 24 November 2019 в 12:03
поделиться

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

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

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

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

23
ответ дан 24 November 2019 в 12:03
поделиться

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

4
ответ дан 24 November 2019 в 12:03
поделиться

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

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

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

3
ответ дан 24 November 2019 в 12:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: