2010-02-24 70 views
50

Đây là một câu hỏi rất cơ bản ... khá đáng lo ngại, nhưng ở đây đi:Làm cách nào để chuyển đổi các đồng hồ bấm giờ thành giây nano, mili giây và giây?

Tôi có một khối Đồng hồ bấm giờ trong mã C#. Tôi xác định thời gian trôi qua trong ve và sau đó muốn chuyển đổi thành ns, ms, s. Tôi biết rằng Tần suất được cung cấp bởi lớp Đồng hồ bấm giờ và nó được yêu cầu để chuyển đổi.

Cảm ơn

Trả lời

68

Stopwatch.Elapsed là một TimeSpan, vì vậy bạn có thể làm myStopwatch.Elapsed.TotalMilliseconds, myStopwatch.Elapsed.TotalSeconds vv

// 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 rằng stopwatch.ElapsedMilliseconds lợi nhuận một long và vì thế chỉ chính xác lên đến phần nghìn giây, trong khi stopwatch.Elapsed.TotalMilliseconds trả về một doublecó độ chính xác tương tự nhưstopwatch.ElapsedTicks, ngoại trừ nó dễ dàng hơn để sử dụng. ILSpy cho thấy rằng TimeSpan.TotalMilliseconds được tính bằng cách sử dụng bọ ve anyway.

+6

Mặc dù vậy, OP không cho bạn nano giây ... –

+0

Cập nhật với ns. – RedFilter

+18

Đó là rất không chính xác, mặc dù, vì nó sẽ cung cấp NS làm tròn đến MS gần nhất. –

44

Theo MSDN, Tần suất cho bạn biết số lượng bọ ve mỗi giây. Do đó:

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' trả về' long' 2) gắn dấu tích vào 'double' hoặc' decimal' trước khi chia cho 'Frequency' – Timeless

2

Sử dụng Elapsed tài sản:

stopwatch.Elapsed.TotalMilliseconds 
4

Từ MSDN docs:

Sử dụng các trường FrequencyIsHighResolution để xác định độ chính xác và độ phân giải của việc thực hiện thời gian Đồng hồ bấm giờ.

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

Nếu bạn nhận được thời gian đã trôi qua từ đồng hồ bấm giờ, có tính chất của đối tượng timepan để lấy giây, mill hoặc bất kỳ thứ gì.

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

Stopwatch.Frequency cung cấp cho bạn ve/giây.

Vì vậy, nếu bạn có ve, bạn có thể chỉ chia tần số để có được giây:

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

Ví dụ, bạn có thể làm:

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

Trong đó, trên hệ thống của tôi, bản in:

3455650175.58075, 3455.65017558075, 3.45565017558075 
+1

Vì vậy, 1ns tương ứng với 1000000000s. Điều đó có vẻ không đúng. :) –

6

Sử dụng lớp này:

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

Sau đó, bạn có thể nhận được trôi qua nano giây/micro chỉ như thế này:

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

Đối mili giây, bạn có thể sử dụng phương pháp ElapsedMilliseconds() của Đồng hồ bấm giờ.

Các vấn đề liên quan