2011-01-20 35 views
10

Tôi muốn đo lường hiệu suất của chuỗi được quản lý (.NET). Để cụ thể, tôi cần đo lường sau -Cách đo hiệu suất của chuỗi được quản lý trong .NET

  1. Chủ đề đang sử dụng CPU bao lâu?

  2. Bao lâu nó vẫn bị chặn (chờ hoàn thành cuộc gọi phương thức từ xa)?

Sử dụng System.Diagnostic.StopWatch không hữu ích vì nó đọc thời gian chạy bằng các chủ đề khác chạy song song và chia sẻ cùng một CPU.

Trả lời

4

Bạn có thể sử dụng phương pháp mô tả ở đây http://www.codeproject.com/KB/dotnet/ExecutionStopwatch.aspx trong đó sử dụng chức năng hệ thống GetThreadTimes http://msdn.microsoft.com/en-us/library/ms683237(v=vs.85).aspx

thời gian chờ là sự chênh lệch giữa tổng số thời gian và thời gian thực hiện.

Added: Tôi thích sử dụng lớp dùng một lần để đo lường hiệu quả - nó giữ mã sạch (sử dụng giao diện điều khiển hardcoded chỉ ví dụ):

public class ThreadPerformance : IDisposable 
{ 
    private Stopwatch _totalStopwatch = new Stopwatch(); 
    private ExecutionStopwatch _executionStopwatch = new ExecutionStopwatch(); 

    public static ThreadPerformance Measure() 
    { 
     return new ThreadPerformance(); 
    } 

    private ThreadPerformance() 
    { 
     _totalStopwatch.Start(); 
     _executionStopwatch.Start(); 
    } 

    public void Dispose() 
    { 
     _executionStopwatch.Stop(); 
     _totalStopwatch.Stop(); 
     Console.WriteLine("Performance mesurement for thread {0}", Thread.CurrentThread.ManagedThreadId); 
     Console.WriteLine("Waiting: {0}", _totalStopwatch.Elapsed - _executionStopwatch.Elapsed); 
     Console.WriteLine("CPU usage: {0}", _executionStopwatch.Elapsed); 
    } 
} 

Cách sử dụng rất đơn giản:

static void ThreadProc() 
{ 
    using (ThreadPerformance.Measure()) 
    { 
     // do some calculations and waitings here 
    } 
} 
+1

Cảm ơn lazyberezovsky. Tôi đã suy nghĩ trên cùng một dòng. Tôi không chắc liệu giải pháp này có hoạt động mà không có bất kỳ vấn đề nào trên các nền tảng hệ điều hành khác nhau/phiên bản .NET/nền tảng phần cứng. Tài liệu của Microsoft không cung cấp bất kỳ sự đảm bảo nào rằng luồng được quản lý .NET sẽ luôn được ánh xạ tới cùng một luồng không được quản lý. Nếu GetCurrentThread() trả về các xử lý luồng khác nhau trong hai cuộc gọi riêng biệt thì sao? – Nitin

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