Scott Davies
Scott Davies

Reputation: 3755

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

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

Upvotes: 83

Views: 111410

Answers (6)

D'Arcy Rittich
D'Arcy Rittich

Reputation: 171579

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.

Upvotes: 108

Zach Johnson
Zach Johnson

Reputation: 24232

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;

Upvotes: 85

Korn&#233;l Regius
Korn&#233;l Regius

Reputation: 3049

Use this class:

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

Then you can get the elapsed nanoseconds/microseconds just like this:

var stopwatch = Stopwatch.StartNew();
//... measured code part
Console.WriteLine(stopwatch.ElapsedNanoSeconds());
// OR
Console.WriteLine(stopwatch.ElapsedMicroSeconds());

For milliseconds you can use the ElapsedMilliseconds() method of Stopwatch.

Upvotes: 12

Reed Copsey
Reed Copsey

Reputation: 564921

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

Upvotes: 34

John Weldon
John Weldon

Reputation: 40799

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

Upvotes: 6

SLaks
SLaks

Reputation: 888273

Use the Elapsed property:

stopwatch.Elapsed.TotalMilliseconds

Upvotes: 2

Related Questions