這是一個非常基本的問題...很尷尬,但這裏有:如何將秒錶刻度轉換爲納秒,毫秒和秒?
我有一個C#代碼中的秒錶塊。我以滴答確定流逝的時間,然後想轉換爲ns,ms,s。我知道頻率由秒錶類提供,並且它是轉換所必需的。
感謝
這是一個非常基本的問題...很尷尬,但這裏有:如何將秒錶刻度轉換爲納秒,毫秒和秒?
我有一個C#代碼中的秒錶塊。我以滴答確定流逝的時間,然後想轉換爲ns,ms,s。我知道頻率由秒錶類提供,並且它是轉換所必需的。
感謝
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
無論如何都是使用tick來計算的。
據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;
1)'sw.ElapsedTicks'返回'long' 2)將刻度滴定爲'double或decimal',然後除以頻率 – Timeless 2017-11-24 05:56:54
使用Elapsed
屬性:
stopwatch.Elapsed.TotalMilliseconds
使用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);
如果您從秒錶中獲得經過的時間,那麼時間範圍對象的屬性可以獲得秒,磨等。
TimeSpan ts = stopWatch.Elapsed;
int seconds = ts.FromSeconds;
int mill = ts.FromMiliseconds;
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
因此1ns對應於1000000000s。這看起來不正確。 :) – 2010-02-24 20:23:30
使用這個類:
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()方法。
儘管OP請求的納秒數不會超過...... – 2010-02-24 20:18:00
用ns更新。 – RedFilter 2010-02-24 20:19:17
雖然這是非常不準確的,因爲它會提供NS舍入到最近的MS。 – 2010-02-24 20:19:44