2008-09-28 34 views
6

Tôi cần phải thực hiện một số tiêu chí hiệu suất trên các chương trình .NET (C#) trong Windows, nhưng tôi chưa thực hiện đo điểm chuẩn nhiều trong thế giới Windows. Tôi đã xem xét sử dụng màn hình hiệu suất Windows 2000/XP với các quầy tùy chỉnh cho điều này, nhưng tôi không nghĩ rằng đây là những gì tôi muốn.Cách tốt nhất để chuẩn chương trình trong Windows là gì?

Có bất kỳ cơ sở hệ thống nào tốt cho điều này trong Windows XP hay không, tôi có cần sử dụng System.Diagnostics.Stopwatch [chỉnh sửa] và viết nhật ký văn bản để giải thích thủ công hay không?

Chỉnh sửa: có bất kỳ điều gì vượt quá System.Diagnostics.Stopwatch không?

+0

Vì vậy mà người khác có thể được hưởng lợi từ câu trả lời bổ sung, tôi nghĩ rằng nó sẽ tốt hơn cho bạn mở lại câu hỏi. –

+0

Aggh, một bài học khác trong song song đã đi sai ... –

+0

@Michael Ratanapintha: cẩn thận để xây dựng? –

Trả lời

5

Đối với điểm chuẩn siêu nhỏ, tôi thực sự thích MeasureIt (có thể được tải xuống từ http://msdn.microsoft.com/en-us/magazine/cc500596.aspx). Nó là một dự án thử nghiệm được viết bởi Vance Morrison một Kiến trúc sư hiệu suất trên CLR. Nó hiện có một bộ tiêu chuẩn tốt cho một số phương thức lõi .Net/CLR. Phần tốt nhất của nó là nó là tầm thường để tinh chỉnh và thêm điểm chuẩn mới cho bất cứ điều gì bạn muốn kiểm tra. Đơn giản chỉ cần chạy "MeasureIt/edit" và nó sẽ khởi động VS với dự án cho chính nó để bạn có thể xem cách những điểm chuẩn được viết và thêm những điểm chuẩn mới theo cách tương tự nếu bạn muốn. Như đã được tuyên bố StopWatch có lẽ là cách dễ nhất để làm điều này và MeasureIt sử dụng StopWatch bên dưới cho timings của nó nhưng nó cũng làm một số thứ khác như chạy một khối mã X lần và sau đó cung cấp cho bạn số liệu thống kê cho chạy và những gì không phải.

8
using System.Diagnostics; 
.... 

Stopwatch sw = new Stopwatch(); 

sw.Start(); 

// Code you want to time... 

// Note: for averaged accuracy (without other OS effects), 
//  run timed code multiple times in a loop 
//  and then divide by the number of runs. 

sw.Stop(); 

Console.WriteLine("Took " + sw.ElapsedTicks + " Ticks"); 
+0

Bạn cũng nên tách chạy lần đầu tiên khỏi kết quả trung bình vì nó có thể bị lệch cao do quá trình biên dịch JIT. –

+0

Ed. S: Điểm tốt, nhưng không nhất thiết. Nếu mã chỉ chạy một lần trong thực tế, thì thời gian JIT có thể cần phải được tính vào. –

+1

Chắc chắn, tôi không có ý định bỏ qua thông tin đó, chỉ để đảm bảo tách biệt nó ra để nó không tăng tăng trung bình. Miễn là người làm bài kiểm tra nhận thức được thực tế này thì nó sẽ ổn thôi. Tôi đã tinh chỉnh một thói quen phân tích cú pháp XML có thể được gọi trên một số lượng dữ liệu khá lớn (liên quan đến những gì là điển hình trong ứng dụng của tôi) và vượt qua đầu tiên mất ~ 931ms, trong khi tất cả các cuộc gọi tiếp theo mất ~ 91ms. –

3

Đây có thể không phải là điều bạn muốn, nhưng dotTrace cung cấp nhiều chẩn đoán hữu ích và được tích hợp vào Visual Studio.

4

Có khá nhiều trình bày trên đó. Dưới đây là một số trong những người tôi biết:

Nếu bạn đi trên với việc sử dụng System.Diagnostics.Stopwatch, bạn sẽ có thể công cụ và chỉ đo lường các điểm cụ thể của mã của bạn, nơi bạn đặt Start/Stop một cách rõ ràng. Điều này là đủ tốt để đo lường các phần cụ thể, như một vòng lặp chặt chẽ hoặc những thứ như thế, nhưng nó sẽ không cung cấp cho bạn một bức tranh hoàn chỉnh về nơi chương trình của bạn dành phần lớn thời gian của nó.

4

Nếu bạn muốn chỉ một số số nhanh, bạn có thể sử dụng Powershell để thực hiện tổng thời gian. Sử dụng lệnh cmdlet đo lường. Nó tương đương với "thời gian" trong Unix.

> measure-command { your.exe arg1 } 

Days    : 0 
Hours    : 0 
Minutes   : 0 
Seconds   : 4 
Milliseconds  : 996 
Ticks    : 49963029 
TotalDays   : 5.78275798611111E-05 
TotalHours  : 0.00138786191666667 
TotalMinutes  : 0.083271715 
TotalSeconds  : 4.9963029 
TotalMilliseconds : 4996.3029 
1

Nếu dự án của bạn là khá lớn và có rất nhiều module làm số lượng lớn các cuộc gọi bạn có thể bạn: http://www.moduleanalyzer.com/

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