Чи можна використовувати секундомір у виробничому коді?


76

Мені потрібен точний таймер, і DateTime. Зараз здається недостатньо точним. З прочитаних описів System.Diagnostics.Stopwatch здається саме тим, що я хочу.

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


Який тип таймера вам потрібен? Ви хочете, щоб якийсь метод викликався через деякий час, або вам потрібно знати, скільки часу минуло до цього часу? Яка точність вам потрібна?
mnemosyn

1
можливий дублікат того, як отримати годинник реального часу в C #? . Я не бачу, чим це відрізняється від іншого питання. Можливо, якщо ви зміните його на ", чи є якісь проблеми із використанням класів System.Diagnostics у виробництві, але зараз це дублікат".
Джон Сондерс,

1
@ John - IMO, точно не дублікат. Інше питання задає питання, як це зробити; це питання задає питання, чи нормально це робити. Інший ОП може мати якісь дивні причини уникати Секундоміра (наприклад, божевільні корпоративні правила BS, які поки що не мають сенсу, але їх слід дотримуватися .. Ні, я не гіркий!)
dss539,

1
Я відчував те саме щодо використання чого-небудь із простору імен System.Diagnostics. Після перевірки надійних джерел, таких як MSDN, набагато бажаніше використовувати їх Stopwatch. Я навіть реалізував власні, оскільки мені потрібні були події: msdn.microsoft.com/en-us/library/aa457094.aspx
IAbstract

Відповіді:


59

Під капотом майже все, що робить Секундомір, - це обгортання QueryPerformanceCounter . Наскільки я розумію, Секундомір існує, щоб забезпечити доступ до таймера з високою роздільною здатністю - якщо вам потрібна ця роздільна здатність у виробничому коді, я не бачу нічого поганого в його використанні.


3
Ми постійно використовуємо QueryPerformanceCounter у виробничому коді. Цілком розумно використовувати цю інфраструктуру у виробництві.
Ерв ​​Вальтер

24

Так, System.Diagnosticsздається, це лише для налагодження, але не дозволяйте назві обманювати вас. Спочатку System.Diagnosticsпростір імен здається трохи страшним для використання у виробничому коді (це зробило для мене), але в цьому просторі імен є багато корисного.

Деякі речі, наприклад, Processклас, корисні для взаємодії з системою. За допомогою Process.Startви можете запускати інші програми, запускати веб-сайт для користувача, відкривати файл або папку тощо.

Інші речі, такі як Traceклас, можуть допомогти вам виявити помилки у виробничому коді. Звичайно, ви не завжди будете використовувати їх у виробничому коді, але вони дуже корисні для реєстрації та відстеження цієї невловимої помилки на віддаленій машині.

Не турбуйтеся про назву.


5

Ви говорите, що читали на іншому форумі, щоб не використовувати класи з System.Diagnosticsвиробництва. Але єдиним джерелом, про яке слід турбуватися, є Microsoft, яка створила код. Кажуть, що StopWatchклас :

Надає набір методів та властивостей, які можна використовувати для точного вимірювання минулого часу.

Вони не кажуть, "крім виробництва".


4

Секундомір Afaik - це оболонка над функціональністю QueryPerformanceCounter . Ця функція є основою багатьох вимірювань, пов'язаних з лічильниками продуктивності. QPF дуже швидко телефонує і абсолютно безпечний. ЯКЩО ви страждаєте від простору імен Diagnostics, зателефонуйте безпосередньо до QPF.


3

Секундомір - це в основному акуратна обгортка навколо рідної мови QueryPerformanceCounterта QueryPerformanceFrequencyметодів. Якщо вам не комфортно користуватися System.Diagnosticпростором імен, ви можете отримати до них доступ безпосередньо .

Використання лічильника продуктивності дуже поширене, у цьому немає нічого поганого. AFAIK, недоступна більш висока точність таймера. Зверніть увагу, що QPF може призвести до проблем з багатопроцесорними машинами, але стаття MSDN, на яку посилається раніше, містить деяку додаткову інформацію про це. Бажано переконатися, що System.Diagnostics.Stopwatchце робиться у фоновому режимі, або зателефонувати SetThreadAffinityвручну - інакше ваш таймер може повернутися назад у часі !

Зверніть увагу, що для вимірювань з дуже високою точністю є деякі тонкощі, які потрібно враховувати. Якщо вам потрібна така велика точність, це може викликати певне занепокоєння.



0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.