Как вы конвертируете метки секундомера в наносекунды, миллисекунды и секунды?
Это очень простой вопрос... довольно смущающий, но здесь идет:
У меня есть блок секундомера в коде С#. Я определяю прошедшее время в тиках, а затем хочу конвертировать в ns, ms, s. Я знаю, что частота обеспечивается классом секундомера и что она необходима для преобразования.
Спасибо
Ответы
Ответ 1
Stopwatch.Elapsed - это 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
вычисляется с использованием тиков в любом случае.
Ответ 2
Согласно 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;
Ответ 3
Stopwatch.Frequency дает вам тики/секунду.
Итак, если у вас есть тики, вы можете просто делить по частоте, чтобы получить секунды:
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
Ответ 4
Используйте этот класс:
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
Из Документы 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);
Ответ 6
Используйте свойство Elapsed
:
stopwatch.Elapsed.TotalMilliseconds
Ответ 7
Если вы получаете прошедшее время из секундомера, есть свойства объекта timepan для получения второго, стана или любого другого.
TimeSpan ts = stopWatch.Elapsed;
int seconds = ts.FromSeconds;
int mill = ts.FromMiliseconds;