проблем с .NET system.diagnostics хронометър

Опитвам се да създам приложение, което включва използването на класа на хронометъра.

Stopwatch sw = new Stopwatch();
sw.Start();
while (play)
{
    long timer = sw.ElapsedMilliseconds;
    Debug.WriteLine(timer);
}

Когато тествах този цикъл и проверих изминалото време, открих, че на програмата липсват няколко милисекунди.

някои часовници от изхода на дебъгера:

31
32
33
34
35
36
37
38
40 ‹------39 пропуснати
41
42
43

Някакви предложения как мога да разреша този проблем?


person RyanB    schedule 30.01.2011    source източник
comment
Как заключихте, че е кратък някои ms?   -  person Marc Gravell    schedule 31.01.2011
comment
Мисля, че вероятно ще трябва да предоставите повече подробности какво означават липсващите милисекунди - може би някакъв резултат.   -  person Neil    schedule 31.01.2011
comment
когато проверих таймера в изхода на дебъгера, числата не са последователни, пример 1,2,3, след което той прескача до 5.   -  person RyanB    schedule 31.01.2011
comment
О хайде? понякога отнема повече от милисекунда, заобикаляйки вашия цикъл - (това изглежда прекалено дълго за прост, какъвто е вашият цикъл) Не трябва да очаквате последователност от извикване до повикване относно това колко време трябва да отнеме всяка операция. Други неща текат. Ако трябва да оптимизирате приложението си, вземете профайлър, ако не, тогава спрете да се тревожите за това. Процесорът няма да се умори от изпълнение на ненужен код.   -  person Neil    schedule 31.01.2011
comment
Този въпрос дава резултати на толкова много нива :D   -  person Alastair Pitts    schedule 31.01.2011
comment
Нийл, ако изпълнявах цяло приложение с да кажем 100 или повече реда код, нямаше да публикувам тук, защото бих разбрал, че може да има проблем с производителността. обаче изпълнявам само кода, показан в публикацията   -  person RyanB    schedule 31.01.2011
comment
защо имате нужда вашият цикъл да има постоянно време за изпълнение? Казахте, че трябва да е с точност до 10 ms, но защо?   -  person jb.    schedule 31.01.2011
comment
Какво искаш да решиш? Какво точно искаш да правиш? Ядрото на Windows имаше и винаги ще има (освен ако не променят нещо драстично) 10ms разделителна способност за превключване на задачи. Вашият процесор се отклони, за да направи нещо по-важно за тази ms.   -  person Daniel Mošmondor    schedule 31.01.2011
comment
добре, опитвам се да направя приложение за изстрелване, което при предварително определени времена (подсказки) издава импулс през rs-232 и комуникира с моя модул за изстрелване... с 10ms би било добре, но когато добавих допълнителна функционалност, неточността беше най-лоша   -  person RyanB    schedule 31.01.2011
comment
Фактът, че другите редове идват на 1 ms, е чисто съвпадение. Console.WriteLine() не е надежден инструмент за синхронизация.   -  person Henk Holterman    schedule 31.01.2011
comment
Това е разгледано преди в дълбочина: stackoverflow.com/questions/4212611/   -  person Cody Gray    schedule 31.01.2011
comment
може ли някой да предложи подходящо решение? дори ако това означава използване на друг език за програмиране   -  person RyanB    schedule 31.01.2011


Отговори (3)


Милисекундите, които губите, се дължат на факта, че вашата програма не е единствената, която работи на операционната система.

Така че от време на време други програми получават своя отрязък от време и няколко милисекунди остават настрана.

Не можете да го "поправите".

person Yochai Timmer    schedule 30.01.2011

Липсват милисекунди? Очаквате ли да видите запис за всяка отделна милисекунда за секунда? напр. 1000 в секунда? Ако е така, това никога няма да се случи. Няма API за синхронизиране с точност до 1 милисекунда.

Фактът, че правите присвояване, както и поточно извеждане в цикъла, където извеждате данните за милисекунди в допълнение към други процеси на операционната система, като например превключване на задачи, означава, че точността на милисекунди не е възможна. Ще ви е необходима специална машина в реално време, за да извлечете вида резултат, който търсите

person Paul Sasik    schedule 30.01.2011
comment
Чудесен пример за неточността на времето е да го направите в Silverlight, където точността е само 15 ms. - person Ray Booysen; 31.01.2011
comment
в моето приложение имам нужда да е поне точен до 10ms, но когато увеличих редовете код и добавих някои функции, таймерът пропускаше по-често и до 60ms:S - person RyanB; 31.01.2011
comment
paul, разбирам гледната ви точка, дори се опитах да увелича приоритета на приложението до реално време и да стартирам изпълнимия файл и след това при прекратяване прехвърлих резултатите във файл, но все още имаше някои грешки. истинският проблем е, че когато добавя някои основни функции като проверка дали таймерът е в определено време, остават повече милисекунди - person RyanB; 31.01.2011
comment
Windows не е операционна система в реално време. - person Lasse V. Karlsen; 31.01.2011
comment
Както Lasse заяви, Windows и C# не са в реално време, така че не можете да очаквате такъв вид точност. Дори и с този вид точност, колко време ще работи вашият код на всеки 10 ms? - person Ray Booysen; 31.01.2011

Debug.WriteLine може да бъде по-бавен от 1 милисекунда. Не е оптимизиран за скорост.

Можете да добавите повикване, поставяйки съобщението в списък и след това да запишете списъка в Debug.WriteLine след изпълнение. Можете да добавите фонова задача, изпращаща съобщението до Debug.WriteLine.

И двете трябва да попречат на таймера да пропусне отметки.

Друга причина за липсващи отметки може да е операционната система или друга програма, която върши някаква работа между две извиквания на Debug.WriteLine. Може дори да е бавна машина.

Задаването на приоритета на нишката или стартирането на това приложение на специална машина трябва да помогне, но този вид проблеми с таймера се очакват в Windows, тъй като никога не е казвал, че е ОС в реално време.

person CodingBarfield    schedule 05.06.2013