2010-02-24 214 views

回答

68

Stopwatch.Elapsed是TimeSpan,所以你可以做myStopwatch.Elapsed.TotalMillisecondsmyStopwatch.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來計算的。

+6

儘管OP請求的納秒數不會超過...... – 2010-02-24 20:18:00

+0

用ns更新。 – RedFilter 2010-02-24 20:19:17

+18

雖然這是非常不準確的,因爲它會提供NS舍入到最近的MS。 – 2010-02-24 20:19:44

44

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; 
+2

1)'sw.ElapsedTicks'返回'long' 2)將刻度滴定爲'double或decimal',然後除以頻率 – Timeless 2017-11-24 05:56:54

2

使用Elapsed屬性:

stopwatch.Elapsed.TotalMilliseconds 
4

MSDN docs

使用FrequencyIsHighResolution字段,以確定秒錶計時執行的精度和分辨率。

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

如果您從秒錶中獲得經過的時間,那麼時間範圍對象的屬性可以獲得秒,磨等。

TimeSpan ts = stopWatch.Elapsed; 
int seconds = ts.FromSeconds; 
int mill = ts.FromMiliseconds; 
13

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 
+1

因此1ns對應於1000000000s。這看起來不正確。 :) – 2010-02-24 20:23:30

6

使用這個類:

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()方法。