How do you convert Stopwatch ticks to nanoseconds, milliseconds and seconds?

Viewed 91857

This is a very basic question...quite embarassing, but here goes:

I have a Stopwatch block in C# code. I determine the elapsed time in ticks and then want to convert to ns, ms, s. I know that the Frequency is provided by the Stopwatch class and that it is required for conversion.

Thanks

6 Answers

Stopwatch.Elapsed is a TimeSpan, so you can do 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);

Output:

Time elapsed (s): 2.4976622
Time elapsed (ms): 2497.6622
Time elapsed (ns): 2497662200

Note that stopwatch.ElapsedMilliseconds returns a long and is thus only precise up to the millisecond, while stopwatch.Elapsed.TotalMilliseconds returns a double and has the same precision as stopwatch.ElapsedTicks, except it's easier to use. ILSpy shows that TimeSpan.TotalMilliseconds is computed using ticks anyway.

According to MSDN, Frequency tells you the number of ticks per second. Therefore:

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;

Stopwatch.Frequency gives you ticks/second.

So, if you have ticks, you can just divide by frequency to get seconds:

long ticks = sw.ElapsedTicks;
double ns = 1000000000.0 * (double)ticks / Stopwatch.Frequency;
double ms = ns / 1000000.0;
double s = ms / 1000;

For example, you can do:

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();
}

Which, on my system, prints:

3455650175.58075, 3455.65017558075, 3.45565017558075

From the MSDN docs:

Use the Frequency and IsHighResolution fields to determine the precision and resolution of the Stopwatch timing implementation.

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);

Use the Elapsed property:

stopwatch.Elapsed.TotalMilliseconds
Related