c# - sirve - ¿Cómo se convierten las marcas del cronómetro en nanosegundos, milisegundos y segundos?
stopwatch c# (7)
De acuerdo con MSDN , Frequency le informa la cantidad de tics por segundo. Por lo tanto:
Stopwatch sw = new Stopwatch();
// ...
double ticks = sw.ElapsedTicks;
double seconds = ticks / Stopwatch.Frequency;
double milliseconds = (ticks / Stopwatch.Frequency) * 1000;
double nanoseconds = (ticks / Stopwatch.Frequency) * 1000000000;
Esta es una pregunta muy básica ... bastante embarazosa, pero aquí va:
Tengo un bloque de Cronómetro en el código C #. Determino el tiempo transcurrido en tics y luego quiero convertir a ns, ms, s. Sé que la Frecuencia es proporcionada por la clase Cronómetro y que es necesaria para la conversión.
Gracias
Desde los documentos de MSDN :
Utilice los campos MSDN e IsHighResolution para determinar la precisión y la resolución de la implementación del tiempo del cronómetro.
long frequency = Stopwatch.Frequency;
Console.WriteLine(" Timer frequency in ticks per second = {0}",
frequency);
long nanosecPerTick = (1000L*1000L*1000L) / frequency;
Console.WriteLine(" Timer is accurate within {0} nanoseconds",
nanosecPerTick);
Si obtienes el tiempo transcurrido desde el cronómetro, hay propiedades del objeto de intervalo de tiempo para obtener el segundo, molino o lo que sea.
TimeSpan ts = stopWatch.Elapsed;
int seconds = ts.FromSeconds;
int mill = ts.FromMiliseconds;
Use esta clase:
public static class Utility
{
public static long ElapsedNanoSeconds(this Stopwatch watch)
{
return watch.ElapsedTicks * 1000000000 / Stopwatch.Frequency;
}
public static long ElapsedMicroSeconds(this Stopwatch watch)
{
return watch.ElapsedTicks * 1000000 / Stopwatch.Frequency;
}
}
Luego puede obtener los nanosegundos / microsegundos transcurridos de la siguiente manera:
var stopwatch = Stopwatch.StartNew();
//... measured code part
Console.WriteLine(stopwatch.ElapsedNanoSeconds());
// OR
Console.WriteLine(stopwatch.ElapsedMicroSeconds());
Durante milisegundos, puede utilizar el método ElapsedMilliseconds () de Cronómetro.
Use la propiedad Elapsed
:
stopwatch.Elapsed.TotalMilliseconds
MSDN frecuencia te da tics / segundo.
Entonces, si tiene garrapatas, puede dividir por frecuencia para obtener segundos:
long ticks = sw.ElapsedTicks;
double ns = 1000000000.0 * (double)ticks / Stopwatch.Frequency;
double ms = ns / 1000000.0;
double s = ms / 1000;
Por ejemplo, puedes hacer:
static void Main()
{
Stopwatch sw = new Stopwatch();
sw.Start();
System.Threading.Thread.Sleep(3456);
sw.Stop();
long ticks = sw.ElapsedTicks;
double ns = 1000000000.0 * (double)ticks / Stopwatch.Frequency;
double ms = ns / 1000000.0;
double s = ms / 1000;
Console.WriteLine("{0}, {1}, {2}", ns, ms, s);
Console.ReadKey();
}
Que, en mi sistema, imprime:
3455650175.58075, 3455.65017558075, 3.45565017558075
Stopwatch.Elapsed es un TimeSpan , por lo que puede hacer myStopwatch.Elapsed.TotalMilliseconds
, myStopwatch.Elapsed.TotalSeconds
, etc.
// Create new stopwatch
Stopwatch stopwatch = new Stopwatch();
// Begin timing
stopwatch.Start();
// Do something
for (int i = 0; i < 1000; i++)
{
Thread.Sleep(1);
}
// Stop timing
stopwatch.Stop();
// Write result
Console.WriteLine("Time elapsed (s): {0}", stopwatch.Elapsed.TotalSeconds);
Console.WriteLine("Time elapsed (ms): {0}", stopwatch.Elapsed.TotalMilliseconds);
Console.WriteLine("Time elapsed (ns): {0}", stopwatch.Elapsed.TotalMilliseconds * 1000000);
Salida:
Time elapsed (s): 2.4976622
Time elapsed (ms): 2497.6622
Time elapsed (ns): 2497662200
Tenga en cuenta que stopwatch.ElapsedMilliseconds
devuelve un valor long
y, por lo tanto, solo es preciso hasta el milisegundo, mientras que el stopwatch.Elapsed.TotalMilliseconds
devuelve un double
y tiene la misma precisión que stopwatch.ElapsedTicks
, excepto que es más fácil de usar. ILSpy muestra que TimeSpan.TotalMilliseconds
se calcula utilizando ticks de todos modos.