2010-09-22 22 views
6

một số phần của chương trình của tôi rất chậm. và tôi đã tự hỏi nếu có công cụ mà tôi có thể sử dụng và ví dụ nó có thể cho tôi biết ok chạy methodA() mất 100ms, vv ... hoặc thông tin hữu ích như vậy tương tự như vậy.Bất kỳ công cụ nào cho biết mỗi phương thức chạy bao lâu?

+3

Nó được gọi là [Profiler] (http://stackoverflow.com/search?q= [c% 23] + profiler). – dtb

+1

Những gì bạn đang tìm kiếm được gọi là profiler. – GrandmasterB

+2

bản sao có thể có của [Một số Profilers .NET tốt?] (Http://stackoverflow.com/questions/3927/what-are-some-good-net-profilers) – dtb

Trả lời

8

Không gian tên System.Diagnostics cung cấp lớp hữu ích được gọi là Stopwatch, có thể được sử dụng để tính thời gian các phần của mã của bạn (coi đó là "hồ sơ người nghèo").

Đây là cách bạn sẽ sử dụng nó:

Stopwatch stopwatch = new Stopwatch(); 
stopwatch.Start(); // Start timing 

// This is what we want to time 
DoSomethingWeSuspectIsSlow(); 

stopwatch.Stop(); 
Console.WriteLine("It took {0} ms.", stopwatch.ElapsedMilliseconds); 
+3

hoặc, tạo một lớp thực hiện idisposable, khởi động bộ đếm thời gian trên hệ thống, dừng lại và ghi trên vứt bỏ. Sau đó, bạn có thể thời gian bất kỳ khối mã bằng cách gói nó với một tuyên bố sử dụng! –

+1

Cũng đảm bảo rằng phương thức đã được gọi ít nhất một lần trước khi định thời gian, để bạn không đo thời gian cho việc biên dịch JIT. –

+0

@ John Gardner - cấu trúc của bạn cũng rất hữu ích để có được thời gian hoàn thiện từ một hệ thống Prod đang chạy. Tích lũy thời gian cho các phần của workitem với một thẻ xác định chúng, và đổ vào cuối của workitem. –

3

Những loại ứng dụng được gọi là "profilers"

Dưới đây là một ví dụ: example

12

Nếu bạn đang sử dụng Visual Studio Team System có một hồ sơ được xây dựng trong trong 'Performance Tools'. Có một tấn nền hữu ích về điều này tại this blog.

Tôi thấy điều này cực kỳ hữu ích trong việc xác định 20% of my code that runs 80% of the time và do đó tôi nên lo lắng về việc tối ưu hóa. Một kỹ thuật đơn giản khác có thể hiệu quả đáng ngạc nhiên là chạy mã phát hành của bạn trong trình gỡ rối và ngắt nó một vài lần (10 hoặc hơn), trong khi đang ở trạng thái 'bận' mà bạn đang cố gắng chẩn đoán . Bạn có thể tìm thấy thông tin callstack định kỳ hướng bạn đến khu vực chung của mối quan tâm. Một lần nữa, quy tắc 80/20 có hiệu lực.

+1

+1 Tôi đã sử dụng phương thức ngắt đó kể từ trước khi profilers được hình thành. Tôi đã rất băn khoăn rằng rất ít người biết điều đó. Tôi sẽ nói nó thực sự xác định khu vực quan tâm, và quy tắc 80/20 giống như 99.9/0.1 –

+0

Đáng buồn thay, liên kết 80/20 đặc biệt trống rỗng. –

+0

@Mike Dunlavey - bạn có tốt hơn không? Tôi sẽ chỉnh sửa nếu có. Cảm ơn –

2

Xem SD C# Profiler của chúng tôi. Nó có thể cung cấp chức năng timings của chức năng của chính nó và/hoặc tất cả các callees của nó.

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