2013-04-24 10 views
8

Voglio misurare il tempo di cui ha bisogno una routine C#. Perché ci sono molti altri thread voglio solo contare il tempo di questo thread. In Java posso usare getCurrentThreadCpuTime.Come posso misurare il tempo di una discussione in C#?

Come posso farlo?

+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 –

risposta

-3

È possibile utilizzare il cronometro per questo. Sarebbe il modo più semplice per farlo.

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

     stopwatch.Start(); 

     ///Do your wwork here 

     var timeElapsed = stopwatch.Elapsed; 
    } 

UPDATE

Ho ricevuto il tuo domanda sbagliata, quindi che dire di questo? Non funziona se si utilizza il thread sleep. Scusa se questo non è ancora quello che stai cercando.

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 non è quello che ha chiesto l'OP. – tnw

+0

Che c'è. – Marco

+0

Qui stai misurando un'operazione, non una discussione, quindi questa risposta non è ciò che l'OP sta cercando. –

1

Si dovrebbe esaminare PerformanceCounters. Sono abbastanza complessi e possono essere un po 'difficili da configurare, ma sono solidi in ciò che offrono per le metriche. Un paio di cose che potrebbero aiutare:

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

Non riesco a vedere come dovrebbe essere misurato solo per il thread corrente. – Horcrux7

1

Non è possibile. Non è possibile misurare il tempo accumulato sulla CPU per un particolare thread. La cosa più accurata che potreste fare è quella di eseguire uno spin separato process per ciascuna delle vostre attività, e quindi misurare il tempo della CPU per il processo (che in realtà può essere fatto in .Net) ... ma è eccessivo.

Se hai bisogno di aiuto su come farlo, dovresti fare un'altra domanda specificatamente per quello.

Problemi correlati