Мне нужны точный таймер и DateTime. Теперь кажется не достаточно точным. Из описаний я читал, Система. Диагностика. Секундомер, кажется, точно, что я хочу.
Но у меня есть фобия. Я озабочен использованием чего-либо от Системы. Диагностика в фактическом производственном коде. (Я использую его экстенсивно для отладки с, Утверждает и PrintLns и т.д., но никогда еще не для производственного материала.) я просто не пытаюсь использовать таймер для сравнительного тестирования моих функций - для моего приложения нужен фактический таймер. Я считал на другом форуме ту Систему. Диагностика. StopWatch только для сравнительного тестирования и не должен использоваться в розничном коде, хотя не было никакой приведенной причины. Это исправляет, или я (и кто бы ни отправил тот совет), слишком закрываемый настроенный о Системе. Диагностика? т.е., это хорошо для использования Системы. Диагностика. Секундомер в производственном коде? Спасибо Adrian
Под капотом почти все, что делает секундомер, - это перенос QueryPerformanceCounter . Насколько я понимаю, секундомер предназначен для обеспечения доступа к таймеру с высоким разрешением - если вам нужно это разрешение в производственном коде, я не вижу ничего плохого в его использовании.
Вы говорите, что прочтите на другом форуме, чтобы не использовать классы из System.Diagnostics
в производстве. Но единственный источник, о котором вам следует беспокоиться, - это Microsoft, создавшая код. Они говорят, что класс StopWatch
:
Предоставляет набор методов и свойств, которые можно использовать для точного измерения прошедшего времени.
Они не говорят: «кроме производства».
В библиотеке базовых классов .NET есть несколько различных классов таймеров - какой из них лучше всего подходит для ваших нужд, можете определить только вы сами.
В зависимости от того, для чего вы используете таймер, у вас могут возникнуть другие проблемы. Windows не предоставляет гарантий по времени выполнения, поэтому не стоит полагаться на нее для обработки в реальном времени (для Windows существуют расширения реального времени, которые обеспечивают жесткое планирование в реальном времени). Я также подозреваю, что вы можете потерять точность в результате переключения контекста после захвата временного интервала и до того, как вы сделаете с ним что-то, что зависит от его точности. В принципе, это может быть произвольно большой промежуток времени; на практике он должен быть порядка миллисекунды. Это действительно зависит от того, насколько критически важно это время.
Да, System.Diagnostics
звучит так, как будто это только для отладки, но не позволяйте имени обмануть вас. Пространство имен System.Diagnostics
поначалу может показаться немного пугающим для использования в производственном коде (это было для меня), но в этом пространстве имен есть много полезных вещей.
Некоторые вещи, например класс Process
, полезны для взаимодействия с системой. С помощью Process.Start
вы можете запускать другие приложения, запускать веб-сайт для пользователя, открывать файл или папку и т. Д.
Другие вещи, такие как класс Trace
, могут поможет вам отслеживать ошибки в производственном коде. Конечно, вы не всегда будете использовать их в производственном коде, но они очень полезны для регистрации и отслеживания этой неуловимой ошибки на удаленной машине.
Не беспокойтесь об имени.
Afaik StopWatch - это оболочка над функциональностью QueryPerformanceCounter . Эта функция является основой многих измерений, связанных со счетчиками производительности. QPF очень быстро звонить и совершенно безопасен. ЕСЛИ вы чувствуете себя параноиком по поводу пространства имен Diagnostics, сразу же pInvoke QPF.
Секундомер является по сути, аккуратной оберткой вокруг родных методов QueryPerformanceCounter
и QueryPerformanceFrequency
. Если вам неудобно использовать пространство имен System.Diagnostic
, вы можете обращаться к ним напрямую.
Использование счетчика производительности очень распространено, в этом нет ничего плохого. AFAIK, более высокой точности таймера не существует. Обратите внимание, что QPF может привести к проблемам на многопроцессорных машинах, но в статье MSDN, ссылка на которую приведена выше, дается дополнительная информация об этом. Рекомендуется убедиться, что System.Diagnostics.Stopwatch
делает это в фоновом режиме или вызвать SetThreadAffinity
вручную - иначе ваш таймер может прыгнуть назад во времени!
Обратите внимание, что для очень высокоточных измерений существуют некоторые тонкости, которые необходимо принимать во внимание. Если вам нужна такая высокая точность, эти нюансы могут представлять определенную опасность.