2012-02-14 18 views
13

Come tutti sappiamo, il cronometro potrebbe presentare problemi in un'applicazione asincrona multi-thread che verrà eseguita su tutti i core.Multicore e thread aware. Net cronometro?

Su un computer multiprocessore, non importa su quale processore viene eseguito il thread. Tuttavia, a causa di bug nel BIOS o HAL (Hardware Abstraction Layer), è possibile ottenere risultati di temporizzazione diversi su processori diversi. Per specificare l'affinità del processore per un thread, utilizzare il metodo ProcessThread.ProcessorAffinity.

C'è qualche modo per me di ottenere alcuni valori di tick/timestamp affidabili che abbiano alta risoluzione/accuratezza e sia coerente con i core della CPU?

Se non è possibile rendere sicuro il cronometro (QueryPerformanceCounter) multi-core, qual è il modo migliore per ottenere un buon timestamp tra i core? DateTime.UtcNow.Ticks o Environment.TickCount? Qualche altro segnalino?

Ho bisogno di una risoluzione migliore di quella che DateTime.UtcNow.Ticks può fornire. (10-15 ms)

risposta

7

Ho cercato personalmente una risposta a questo specifico problema e il meglio che ho visto è DateTime.UtcNow. Sembrerebbe che non ci sia Windows esposto ad alta risoluzione e contatore affidabile (ho cercato su Google per uno per età e non ho ancora incontrato nessuno).

+0

codice di esempio di utilizzo? –

5

In realtà, secondo lo official documentation, post-Windows XP, dovrebbe essere opportuno utilizzare StopWatch/QueryPerformanceCounter su sistemi multiprocessore. Se il sistema non supporta TSC invariante, QPC utilizzerà automaticamente una diversa strategia del timer.

Si noti la sezione dei commenti, tuttavia, per i sistemi virtualizzati. Sembra che tu debba stare attento in quel caso specifico.