2010-05-27 38 views
79

Tôi muốn theo dõi hiệu suất mã của mình để tôi lưu trữ thời gian bắt đầu và kết thúc bằng cách sử dụng System.DateTime.Now. Tôi lấy sự khác biệt giữa hai là thời gian mã của tôi để thực thi.Đồng hồ bấm giờ và sử dụng System.DateTime.Now cho các sự kiện thời gian

Tôi nhận thấy rằng sự khác biệt dường như không chính xác. Vì vậy, tôi đã thử sử dụng một đối tượng Stopwatch. Điều này hóa ra là nhiều, chính xác hơn nhiều.

Bất cứ ai có thể cho tôi biết lý do tại sao Stopwatch sẽ chính xác hơn so với tính toán sự khác biệt giữa thời gian bắt đầu và kết thúc sử dụng System.DateTime.Now?

BTW, tôi không nói về phần mười phần trăm. Tôi nhận được khoảng 15-20% sự khác biệt.

+2

Dựa trên nhận xét của bạn về câu trả lời của Kelsey, tôi muốn được xem mã ghi lại thời gian bắt đầu và thời gian dừng. Một sự khác biệt 11 giây (rất lớn) là không có gì để làm với sự khác biệt chính xác của hai lớp, do đó, một cái gì đó khác đã được đi vào. –

+3

Ngoài ra, nếu bạn chỉ quan tâm đến 'TimeSpan' giữa hai ngày, tốt hơn nên sử dụng' DateTime.UtcNow' thay vì 'DateTime.Now', vì bạn thường không muốn thay đổi giờ ban ngày và giờ địa phương khác các biến thể ảnh hưởng đến kết quả. –

+0

@DanielPryden, Xem [Trường hợp chống lại DateTime.Now] (http://codeofmatt.com/2013/04/25/the-case-against-datetime-now/), làm cho điểm đó chính xác. +1 –

Trả lời

65

Theo MSDN:

Các biện pháp Stopwatch trôi qua thời gian bằng cách đếm timer bọ ve trong cơ chế hẹn giờ cơ bản. Nếu phần cứng và hệ điều hành được cài đặt hỗ trợ bộ đếm hiệu năng có độ phân giải cao, thì lớp Đồng hồ bấm giờ sử dụng bộ đếm đó để đo thời gian trôi qua. Nếu không, lớp Đồng hồ bấm giờ sử dụng bộ hẹn giờ hệ thống để đo thời gian trôi qua. Sử dụng các trường Frequency và IsHighResolution để 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ờ.

Sử dụng độ phân giải/độ chính xác cao hơn DateTime.Now.

Bạn cũng có thể kiểm tra các liên kết liên quan:

Environment.TickCount vs DateTime.Now

Is DateTime.Now the best way to measure a function's performance?

DateTime là đủ tốt cho độ chính xác đến từng giây lẽ nhưng bất cứ điều gì ngoài mà tôi muốn giới thiệu StopWatch.

6

timing function performance liên kết này thảo luận về vấn đề chính xác của bạn, đặc biệt là đoạn này:

Vấn đề là theo MSDN độ phân giải của hàm DateTime.Now là 10+ mili giây, và chúng ta cần phải gọi nó là hai lần! Vì vậy, đó sẽ giới thiệu một 20 + ms swing trong đo thời gian chạy của bạn. Vì các cuộc gọi hàm của chúng tôi thường có khả năng trở lại nhanh hơn rất nhiều so với cửa sổ 20ms này, điều này không đủ tốt.

EDIT: Loại âm thanh như DateTime.Now thứ hai đang được gọi vào thời điểm khác với thời điểm kết thúc phương pháp đồng hồ bấm giờ.

26

Nó tốt hơn để sử dụng lớp Stopwatch vì nó chính xác hơn nhiều so với trừ giá trị DateTime:

Stopwatch s = Stopwatch.StartNew(); 
// Tested code here 
s.Stop(); 
Console.WriteLine("Elapsed Time: {0} ms", s.ElapsedMilliseconds); 

Thật không may, điều này mảnh mã đơn giản sẽ không đủ để có được số đo chính xác nhất của thời đại bởi vì có rất nhiều hoạt động đang diễn ra dưới sự che chở của hệ điều hành, có thể ăn cắp thời gian CPU và làm chậm quá trình thực thi mã của bạn. Đó là lý do tại sao tốt nhất là thực hiện các thử nghiệm nhiều lần và sau đó loại bỏ các lần thấp nhất và cao nhất. Đối với puprose đó, nó là một giải pháp tốt để có một phương thức thực thi mã thử nghiệm nhiều lần, loại bỏ thời gian thấp nhất và lớn nhất và tính toán thời gian trung bình. Tôi đã xuất bản một số sample testing method in my blog.

+0

Tôi đã kiểm tra liên kết blog của bạn. Có một lỗi nhỏ trong tính toán thời gian trung bình. Thay vì 'double averageTime = ((double) totalTime)/(count - discardCount);' nó phải là 'double averageTime = ((double) totalTime)/(count - (2 * discardCount));'. Không? – displayName

+0

Xin chào, ** không, mã trong blog là chính xác **. Hãy nhìn vào dòng, trong đó 'đếm' được xác định. Nó được định nghĩa là: 'int count = repetitions - discardCount;'. Đó là lý do tại sao khi tính thời gian trung bình tôi trừ 'discardCount' chỉ một lần (nó đã được trừ một lần). Trân trọng. –

+0

Đúng vậy. Không chú ý đến nó. Bạn đúng rồi. – displayName

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