2013-04-24 36 views
8

Tôi muốn đo thời gian mà một thói quen C# cần. Bởi vì có nhiều chủ đề khác tôi chỉ muốn đếm thời gian của một chủ đề này. Trong Java, tôi có thể sử dụng getCurrentThreadCpuTime.Làm cách nào để đo thời gian của chuỗi trong C#?

Tôi có thể làm như thế nào?

+0

http://stackoverflow.com/questions/934497/how-can-i-get-cpu-usage-and-or-ram-usage-of-a-thread-in-c-sharp-managed-code – Carsten

+0

http://www.pinvoke.net/default.aspx/kernel32.getthreadtimes –

Trả lời

-3

Bạn có thể sử dụng Đồng hồ bấm giờ cho điều đó. Nó sẽ là cách đơn giản nhất để có được điều đó.

public void Worker() 
    { 
     var stopwatch = new Stopwatch(); 

     stopwatch.Start(); 

     ///Do your wwork here 

     var timeElapsed = stopwatch.Elapsed; 
    } 

CẬP NHẬT

Tôi có câu hỏi của bạn sai, vì vậy những gì về điều này? Nó không hoạt động nếu bạn sử dụng giấc ngủ thread. Xin lỗi nếu điều này vẫn không phải là những gì bạn đang tìm kiếm.

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Diagnostics; 
    using System.Threading; 
    using System.Runtime.InteropServices; 
    using System.Collections.Concurrent; 

    namespace ConsoleApplication2 
    { 
     class Program 
     { 
      static ConcurrentDictionary<int, ProcessThread> threadIdsMapping = new ConcurrentDictionary<int, ProcessThread>(); 


      static void Main(string[] args) 
      { 
       Thread oThread = new Thread(
        delegate() 
        { 
         threadIdsMapping.GetOrAdd(Thread.CurrentThread.ManagedThreadId, GetProcessThreadFromWin32ThreadId(null)); 

         long counter = 1; 

         while (counter < 1000000000) 
         { 
          counter++; 
         } 
        }); 

       oThread.Start(); 
       oThread.Join(); 

       Console.WriteLine(threadIdsMapping[oThread.ManagedThreadId].TotalProcessorTime); 
       Console.WriteLine(threadIdsMapping[oThread.ManagedThreadId].UserProcessorTime); 
       Console.WriteLine(DateTime.Now - threadIdsMapping[oThread.ManagedThreadId].StartTime); 

       Console.ReadKey(); 
      } 

      public static ProcessThread GetProcessThreadFromWin32ThreadId(int? threadId) 
      { 
       if (!threadId.HasValue) 
       { 
        threadId = GetCurrentWin32ThreadId(); 
       } 

       foreach (Process process in Process.GetProcesses()) 
       { 
        foreach (ProcessThread processThread in process.Threads) 
        { 
         if (processThread.Id == threadId) return processThread; 
        } 
       } 

       throw new Exception(); 
      } 

      [DllImport("Kernel32", EntryPoint = "GetCurrentThreadId", ExactSpelling = true)] 
      public static extern Int32 GetCurrentWin32ThreadId(); 
     } 
    } 
+1

-1 đó không phải là những gì OP hỏi. – tnw

+0

Có gì ở đó. – Marco

+0

Bạn đang đo lường một hoạt động ở đây, không phải là một chủ đề, vì vậy câu trả lời này không phải là những gì OP đang tìm kiếm. –

1

Bạn nên xem PerformanceCounters. Chúng khá phức tạp và có thể hơi khó khăn để thiết lập, nhưng mạnh mẽ trong những gì chúng cung cấp cho các số liệu. Một vài điều có thể giúp:

Performance counters and threading

http://blogs.msdn.com/b/adamhems/archive/2008/12/04/using-custom-performance-counters-to-measure-multi-threaded-operation-durations.aspx

+0

Tôi không thể thấy cách này nên đo lường cho chỉ chuỗi hiện tại. – Horcrux7

1

Bạn không thể. Bạn không thể đo thời gian tích lũy TRÊN CPU cho một thread cụ thể. Điều chính xác nhất bạn có thể làm là xoay vòng process riêng biệt cho từng tác vụ của bạn và sau đó đo thời gian CPU cho quá trình (thực tế có thể được thực hiện trong .Net) ... nhưng đó là quá mức cần thiết.

Nếu bạn cần trợ giúp về cách thực hiện điều đó, bạn nên đặt câu hỏi khác cụ thể cho điều đó.

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