2011-08-08 37 views
31

thể Duplicates:
Is DateTime.Now the best way to measure a function's performance?
Stopwatch vs. using System.DateTime.Now for timing eventsNET Stopwatch - hiệu suất phạt

tôi có mã mà cần phải chạy càng nhanh càng tốt. Để có thể ghi lại thời gian thực hiện, tôi sử dụng lớp Stopwatch. Tôi nghi ngờ, Đồng hồ bấm giờ có thể ảnh hưởng đến hiệu suất theo cách xấu. Có thể sử dụng chênh lệch DateTime có thể hiệu quả hơn?

Bạn nghĩ hiệu suất nào tốt hơn?

Stopwatch sw = new Stopwatch(); 
sw.Start(); 
int a = 5; 

// Critical lines of code 

long elapsedMs = se.Elapsed.TotalMilliseconds; 

HOẶC

DateTime startDate = DateTime.Now; 
int a = 5; 

// Critical lines of code 

long elapsedMs = DateTime.Now.Subtract(startDate).TotalMilleseconds; 
+4

Tôi rất nghi ngờ sử dụng hoặc sẽ mang lại cho bạn kết quả tương tự. Sự khác biệt do hậu quả. –

+1

Xem http://stackoverflow.com/questions/2923283/stopwatch-vs-using-system-datetime-now-for-timing-events – ccellar

+1

Xem: http://stackoverflow.com/questions/28637/is-datetime- Bây giờ-the-tốt nhất-to-measure-a-chức năng-hiệu suất - tl; dr: Sử dụng đồng hồ bấm giờ. –

Trả lời

43

Các Stopwatch không được làm bất cứ điều gì giữa cuộc gọi đến StartStop ... Nó chỉ lưu dấu thời gian hiện tại (thông qua QueryPerformanceCounter) khi bạn bắt đầu nó, và so sánh nó với dấu thời gian hiện tại khi bạn ngăn chặn nó. Vì vậy, không có lý do gì có thể ảnh hưởng đến hiệu suất của mã của bạn, ít nhất là không đáng kể. Stopwatch được thiết kế đặc biệt để đo thời gian chính xác, vì vậy bạn có thể chắc chắn rằng nó được tối ưu hóa triệt để. Nó cũng chính xác hơn nhiều so với các giá trị kế tiếp của DateTime.Now. ...

+1

Câu hỏi cũng là về Đồng hồ bấm giờ làm gì bên trong các cuộc gọi Start() và Stop() và điều này ảnh hưởng đến ứng dụng như thế nào. VS2013 Performance Analyzer cho thấy rằng Stopwatch.Stop() lãng phí khoảng 0,92% (ứng dụng 80000 sql truy vấn, 1thread, sw.Start()/sw.Stop() trước mỗi) – mistika

+0

Giải thích tôi đang tìm kiếm. – Neo

1

Tôi nghĩ rằng điều thứ hai sẽ hiệu quả hơn như xa như hiệu suất là có liên quan, và như các liên kết trong các bình luận chỉ ra, nếu bạn muốn để đo thời gian dưới đây giây sau đó DateTime sẽ không chính xác mặc dù nó sẽ hiệu quả

Tôi nghĩ vậy vì Đồng hồ bấm giờ sẽ đo các dấu liên tục so với DateTime sẽ chỉ giữ một phiên bản của DateTime, tức là, startTime.

+1

Chăm sóc để làm rõ? – ChaosPandion

+0

+1 cho câu đầu tiên đúng. Lấy DateTime hiện tại chỉ là đọc một bộ đếm từ bộ nhớ. Tuy nhiên, như bạn nói, hiệu suất không phải là số liệu đúng để suy nghĩ về ở đây, độ chính xác của nó. – nawfal

8

Vì mã lược tả của bạn chỉ được thực hiện một lần nên tác động hiệu suất của nó sẽ không đáng kể. Nó chỉ là một vấn đề nếu bạn đặt các cuộc gọi đến đồng hồ bấm giờ bên trong vòng lặp bên trong của bạn/codepaths quan trọng.

GetTickCount() phải là một trong những cách nhanh nhất để cấu hình, nhưng nó chỉ có độ chính xác vài phần nghìn giây. Hàm GetTickCount() Windows API chỉ kiểm tra một biến đơn giản (được cập nhật sau mỗi vài mili giây); chi phí của nó là chi phí của một lời gọi phương thức bản địa và không có gì hơn. Nó được hiển thị dưới dạng Environment.TickCount trong .NET. Nhưng như tôi đã nói, tôi nghi ngờ vấn đề này. DateTime.UtcNow/Now có cùng độ chính xác (thấp) như GetTickCount.

Về lý thuyết, có thể có một số ảnh hưởng đối với jitter, nhưng điều đó là không thể.

1

Tôi không nghĩ rằng nó thực sự là vấn đề nếu bạn chỉ gọi nó một vài lần, Tuy nhiên, mọi thứ phụ thuộc vào mức độ chính xác mà bạn yêu cầu cho là gì; Stopwatch chính xác hơn nhiều vì nó dựa trên API QueuePerformanceCounter, do đó, nó sử dụng độ phân giải cao hơn.

1

Câu trả lời thực sự phụ thuộc vào độ chính xác mà bạn đang cố gắng đạt được. Đối với độ chính xác lớn hơn giây đồng hồ bấm giờ là một cách tiếp cận tốt hơn do sử dụng một hệ thống đo lường chính xác hơn so với datetime. Xem http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx

Từ quan điểm hiệu suất, tôi nghi ngờ có nhiều sự khác biệt khi thấy Start() và DateTime.Now lưu trữ các giá trị từ hệ thống đo tương ứng và khi truy xuất mili giây tính toán sự khác biệt và chuyển đổi (theo yêu cầu) sang đơn vị đo tương ứng

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