2009-07-30 4 views
33

Sto cercando come formattare il tempo compresi i microsecondi. Sto usando la classe DateTime, consente (usando le proprietà) di ottenere dati fino a millisecondi, che non è enougth. Ho provato a usare Ticks, ma non sapevo come tradurlo in microsecondi.C# in microsecondi

+4

stare attenti con DateTime.Now, non è preciso al microsecondo. Prova System.Diagnostics.Stopwatch per afferrare il tempo. Assicurati anche di avere un orologio di sistema ad alta risoluzione. –

+0

Sì, hai ragione. Mi ci è voluto tempo per capire questo commento. Sebbene Presenta il tempo in microsceonds, il tempo non è in microsecondi. –

risposta

71

È possibile utilizzare "ffffff" in una stringa di formato per rappresentare microsecondi:

Console.WriteLine(DateTime.Now.ToString("HH:mm:ss.ffffff")); 

per convertire un numero di zecche a microsecondi, basta usare:

long microseconds = ticks/(TimeSpan.TicksPerMillisecond/1000); 

Se questi non aiutano, Si prega di fornire maggiori informazioni su esattamente quello che stai cercando di fare.

EDIT: ho inizialmente moltiplicato ticks per 1000 per evitare di perdere precisione quando si divide TimeSpan.TicksPerMillisecond per 1000. Tuttavia, si scopre che la TicksPerMillisecond è in realtà un valore costante di 10.000 - in modo da poter dividere per 1000 senza alcun problema, e in Infatti potremmo semplicemente usare:

const long TicksPerMicrosecond = 10; 

... 

long microseconds = ticks/TicksPerMicrosecond; 
+0

Ho usato entrambi gli opy il problema è che ottengo sempre i microsecondi zero. Sembra che non possa ottenere la risoluzione di quello. –

+2

Quindi questo non è un problema di formattazione, è un problema di risoluzione. Da dove prendi i dati per iniziare? Se stai cercando di calcolare quanto tempo impiega qualcosa, dovresti usare la classe 'Cronometro'. –

+0

No. Ne ho solo bisogno per il logger. Per ogni evento nel sistema, inserisco all'inizio l'ora in cui è successo. Qualche suggerimento? –

6

"ffffff" è quello che ti serve.

return DateTime.Now.ToString("HH:mm:ss.ffffff"); 
+0

L'ho usato il problema è che stampa sempre zero al microsecondo, come se non lo calcolasse. –

+0

Questo non è un problema con la formattazione, questo è un problema con l'accuratezza DateTime.Ora. Prova a utilizzare System.Diagnostics.Stopwatch. –

+0

Ho provato un'altra finestra (la mia è vista) e la risoluzione dei microsecondi –

18

Non sono riuscito a far virare Johns alla conversione del micorosecondo per funzionare. Ecco come sono stato in grado di misurare microsecondi e la risoluzione Nanosecondo utilizzando zecche e il cronometro:

Stopwatch sw = new Stopwatch(); 
sw.Start(); 

// Do something you want to time 

sw.Stop(); 

long microseconds = sw.ElapsedTicks/(Stopwatch.Frequency/(1000L*1000L)); 
long nanoseconds = sw.ElapsedTicks/(Stopwatch.Frequency/(1000L*1000L*1000L)); 

Console.WriteLine("Operation completed in: " + microseconds + " (us)"); 
Console.WriteLine("Operation completed in: " + nanoseconds + " (ns)"); 
+0

sw.Elapsed.TotalMilliseconds è buona. Quindi dividere per 1000 per ottenere microsecondi. – rocketsarefast

+0

Questo non è giusto, perché (Cronometro.Frequenza/(1000L * 1000L)) è un valore lungo lascia tutto dopo un decimale per esempio se il risultato dell'equazione nella riga sopra (del mio commento) è 2.8576 che è tecnicamente 3 ma sw.ElapsedTicks sarà diviso per 2 non 2.8 o 3, che è completamente sbagliato. – user2913184