Istnieje techniczne wytłumaczenie tego, nie mogę w inny sposób udowodnić, że wyjaśnia to twoją obserwację. Z pewnością nie jest to repro na mojej maszynie.
Na początek szukacie cyfr szumów, zegar systemu operacyjnego nie jest na tyle dokładny, aby zapewnić dokładność poniżej milisekund. Upewnij się więc, że nigdy nie polegasz na ich wartości, aby zrobić coś ważnego. Jeśli chcesz zmierzyć interwał z wysoką rozdzielczością, musisz zamiast tego użyć Stopwatch.
Na zegar systemu operacyjnego wpływ mają aktualizacje z serwera czasu. Większość urządzeń jest skonfigurowana tak, aby okresowo kontaktowały się z time.windows.com
, aby ponownie skalibrować zegar. To pozbywa się dryfowania zegara, sprzęt komputerowy zwykle nie jest wystarczająco dobry, aby utrzymać dokładność czasu do lepszej niż sekunda przez miesiąc. Kryształy o niskiej tolerancji są drogie i nigdy całkowicie nie dryfują ze względu na temperaturę i efekty starzenia. Co sekundę wskakuje sekunda, aby synchronizować zegary ze spowalniającym obrotem planety. Ostatni z nich spowodował awarię wielu maszyn Linux, Google "Linux leap second bug" dla przyjemnej lektury.
Ważne jest, co dzieje się, gdy komputer otrzymuje nową aktualizację wymagającą dostosowania zegara. Windows nagle zeruje wartość zegara, co powoduje poważne problemy z programami, które zwracają uwagę na zegar i oczekują, że będzie on konsekwentnie zwiększał się w przewidywalnych ilościach.
Zamiast tego dodaje trochę za jednym razem z każdym przyrostem taktu zegara. W efekcie sprawi, że zegar będzie działał wolniej lub szybciej, więc stopniowo zmieni różnicę i ponownie osiągnie dokładność. Być może widzisz, gdzie to idzie, dodatkowe dodane mikrosekundy są proporcjonalne do długości interwału. Widzenie interwału powtórzonego w cyfrach szumów jest wiarygodne.
Jedynym sposobem na udowodnienie tej teorii jest wybranie funkcji GetSystemTimeAdjustment(). Zwróci wartości niezerowe, gdy trwa regulacja czasu systemowego. Następnie wybierz funkcję SetSystemTimeAdjustment(), aby ją wyłączyć i obserwuj, czy ma to wpływ na wyświetlaną wartość. Lub po prostu poczekaj wystarczająco długo, aż zegar się dogoni, więc nie będzie już więcej regulowany.
to prawdopodobnie szczęście losowania. również: spójrz na klasę 'Stopwatch'. –
Ile razy jest zawsze? –
'DateTime.Now' * w najlepszym przypadku * ma dokładność milisekundy. W praktyce często jest to zaledwie 16 ms. Podejrzewam, że część ułamkowa jest artefaktem, w jaki sposób okna (nie .net) reprezentują dane wewnątrz. – CodesInChaos