2010-09-07 15 views
5

Những gì tôi có nghĩa là ...Đây có phải là cách tốt để kiểm tra lượng thời gian cần thiết để chạy một số mã trong C# không?

có được thời gian, chạy các mã, có thời gian, so sánh thời gian và nhận được giây ra:

tôi làm đúng điều này?

DateTime timestamp = DateTime.Now; 
//...do the code... 
DateTime endstamp = DateTime.Now; 

string results = ((endstamp.ticks - timestamp.ticks)/10000000).ToString(); 
+0

Công cụ tốt nhất cho việc này là các công cụ hồ sơ thực sự như hồ sơ RedGate hoặc một công cụ có kèm theo một trong các phiên bản của studio trực quan. Vì thiếu điều đó, những gì Anthony nói sẽ là cược tốt nhất của bạn –

+1

@George - Đối với các hoạt động lớn hoặc xem thời gian được chi tiêu có thể đúng, nhưng đối với đoạn mã ngắn, hãy xem cách nhanh nhất để làm điều gì đó 10.000 lần chẳng hạn ... profilers tích cực can thiệp và có lẽ không phải là cách tốt nhất để đi về việc có được kết quả chính xác. –

+0

Đủ công bằng, tốt. –

Trả lời

6

No. Sử dụng số System.Diagnostics.Stopwatch thay vào đó. DateTime.Now không có mức độ chính xác mà bạn mong muốn (mặc dù cấu trúc DateTime rất chính xác, trong và chính nó).

Stopwatch watch = new Stopwatch(); 
watch.Start(); 
// do stuff 
watch.Stop(); 
long ticks = watch.ElapsedTicks; 
+0

bất kỳ mẫu triển khai nào? – BigOmega

+0

@Ryan, đã thêm mẫu. –

+4

Thật vậy, DateTime có rất nhiều * độ chính xác * nhưng nó không có mức độ tương xứng * độ chính xác *. Xem http://blogs.msdn.com/b/ericlippert/archive/2010/04/08/precision-and-accuracy-of-datetime.aspx để biết một số suy nghĩ về điều đó. –

13

Bạn nên sử dụng Stopwatch cho điều này, ví dụ:

var sw = Stopwatch.StartNew(); 
//...do the code... 
sw.Stop(); 
var result = sw.ElapsedTicks; //ticks it took 
//or less accurate/for bigger tasks, sw.ElapsedMilliseconds 

Edited để bao gồm @Brian 's cải thiện từ ý kiến.

+5

+1. Một phím tắt là: 'var sw = Stopwatch.StartNew();' chỉ đưa hai dòng đầu tiên lại với nhau thành một. Ngoài ra, trừ khi phải mất một lượng thời gian TINY, tôi thích 'sw.ElapsedMilliseconds' vì nó có ý nghĩa hơn với tôi so với bọ ve. –

+0

@Brian - Tôi đã sử dụng 1000 lần này và * không bao giờ * chú ý '.StartNew()', mũ tắt sir. –

+0

Đồng hồ bấm giờ cũng được viết blog độc đáo bởi [James Michael] (http://geekswithblogs.net/BlackRabbitCoder/archive/2010/08/26/c.net-five-little-wonders-that-make-code-better-1 -of.aspx) và được công bố bởi [ScottGu] (http://weblogs.asp.net/scottgu/archive/2010/08/29/august-29th-links-net-asp-net-iis-express-silverlight- windows-phone-7.aspx) một vài tuần trước – slugster

0

Đây có thể là ok, nhưng lưu ý rằng có một số phương tiện cho "số lượng thời gian phải mất để chạy một số mã". Những gì bạn đã có đó là thời gian đồng hồ treo tường: lượng thời gian trôi qua trong thế giới giữa các cuộc gọi đầu tiên và thứ hai đến DateTime.Now (khoảng). Điều đó sẽ bao gồm thời gian chờ đợi trên ổ khóa hoặc truy cập đĩa, thời gian chạy các chủ đề khác không chứa mã của bạn, v.v.

1

Rõ ràng là các quy trình thực thi trên máy của bạn sẽ làm sai lệch kết quả bạn nhận được.
Đồng hồ bấm giờ là một giải pháp tốt, như đã nêu trong MSDN:

Đồng hồ bấm giờ đo thời gian trôi qua bằng cách đếm đếm thời gian 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ờ.

Lớp Đồng hồ bấm giờ hỗ trợ thao tác các bộ đếm hiệu suất liên quan đến thời gian trong mã được quản lý. Cụ thể, trường tần số và phương thức GetTimestamp có thể được sử dụng thay cho các hàm Win32 APIs QueryPerformanceFrequency và QueryPerformanceCounter không được quản lý.

0

Điều đó sẽ làm tăng thời gian của bạn một chút, nhưng nói chung nó hoạt động. Bạn cũng có thể làm theo các nguyên tắc hướng-khía cạnh và áp dụng một cái gì đó giống như log4net để có được tính năng này mà không cần phải mã hóa nó ở khắp mọi nơi.

Here is an article trên đó.

11

Như nhiều người đã lưu ý, lớp Đồng hồ bấm giờ chính xác cao được thiết kế để trả lời câu hỏi "mất bao lâu?" trong khi lớp DateTime được thiết kế để trả lời câu hỏi "khi nào thì Doctor Who bắt đầu?" Sử dụng các công cụ thích hợp cho công việc.

Tuy nhiên, có nhiều vấn đề về đo chính xác thời gian trôi qua hơn là chỉ cần nhận hẹn giờ đúng. Bạn cũng phải đảm bảo rằng bạn đang đo lường những gì bạn thực sự muốn đo lường.Ví dụ: xem xét:

// start the timer 
M(); 
// stop the timer 
// start another timer 
M(); 
// stop the timer 

Có sự khác biệt đáng kể nào giữa thời gian của hai cuộc gọi không? Có thể có. Hãy nhớ rằng, lần đầu tiên một phương thức được gọi là jitter phải biên dịch nó từ IL thành mã máy. Điều đó cần có thời gian. Cuộc gọi đầu tiên đến một phương thức có thể trong một số trường hợp nhiều hơn lần lâu hơn mọi cuộc gọi tiếp theo được đặt cùng nhau.

Vậy đo lường nào là "đúng"? Phép đo đầu tiên? Thư hai? Trung bình của họ? Tùy thuộc vào những gì bạn đang cố gắng tối ưu hóa cho. Nếu bạn đang tối ưu hóa cho khởi động nhanh thì bạn quan tâm rất nhiều về thời gian jit. Nếu bạn đang tối ưu hóa cho số trang giống nhau được phân phát mỗi giây trên máy chủ được khởi động thì bạn không quan tâm đến thời gian jit và nên thiết kế các thử nghiệm của mình để không phải là đo lường. Đảm bảo bạn đang đo lường điều bạn đang thực sự tối ưu hóa.

1

Các đề xuất được đưa ra trong các câu trả lời trước sẽ hoạt động cho các phép đo đơn giản. Nếu bạn cần một cái gì đó cao cấp hơn, bạn có thể muốn sử dụng một hồ sơ (có những người thương mại và những cái miễn phí như equatec).

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