Как вы конвертируете отметки секундомера в наносекунды, миллисекунды и секунды? - PullRequest
57 голосов
/ 24 февраля 2010

Это очень простой вопрос ... довольно неловко, но здесь идет речь:

У меня есть блок секундомера в коде C #. Я определяю прошедшее время в тиках, а затем хочу преобразовать в нс, мс, с. Я знаю, что Частота предоставляется классом Секундомер и что она требуется для преобразования.

Спасибо

Ответы [ 6 ]

81 голосов
/ 24 февраля 2010

Секундомер. Прошло TimeSpan , поэтому вы можете сделать myStopwatch.Elapsed.TotalMilliseconds, myStopwatch.Elapsed.TotalSeconds и т. Д.

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

Выход:

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

Обратите внимание , что stopwatch.ElapsedMilliseconds возвращает long и, таким образом, является точным только с точностью до миллисекунды, в то время как stopwatch.Elapsed.TotalMilliseconds возвращает double, а имеет такую ​​же точность , что и stopwatch.ElapsedTicks, за исключением того, что его проще использовать. ILSpy показывает, что TimeSpan.TotalMilliseconds все равно вычисляется с использованием тиков.

53 голосов
/ 24 февраля 2010

Согласно MSDN , Частота сообщает вам количество тактов в секунду. Поэтому:

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;
19 голосов
/ 24 февраля 2010

Секундомер. Частота дает вам тиков в секунду.

Итак, если у вас есть тики, вы можете просто разделить их по частоте, чтобы получить секунды:

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

Например, вы можете сделать:

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

Который в моей системе печатает:

3455650175.58075, 3455.65017558075, 3.45565017558075
7 голосов
/ 17 сентября 2012

Используйте этот класс:

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

Тогда вы можете получить прошедшие наносекунды / микросекунды так:

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

Для миллисекунд вы можете использовать метод секундомера ElapsedMilliseconds ().

5 голосов
/ 24 февраля 2010

Из документов MSDN :

Используйте поля Frequency и IsHighResolution , чтобы определить точность и разрешение реализации синхронизации секундомера.

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);
2 голосов
/ 24 февраля 2010

Используйте свойство Elapsed:

stopwatch.Elapsed.TotalMilliseconds
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...