2013-04-24 20 views
8

C# rutininin ihtiyaç duyduğu süreyi ölçmek istiyorum. Çünkü başka bir çok iş parçacığı olduğu için, sadece bu iş parçacığının zamanını saymak istiyorum. Java'da getCurrentThreadCpuTime'u kullanabilirim.Bir iş parçacığının zamanını C# cinsinden nasıl ölçebilirim?

Bunu nasıl yapabilirim?

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

cevap

-3

Bunun için Kronometre'yi kullanabilirsiniz. Bunu elde etmenin en basit yolu olurdu. Bu konuda senin soru yanlış var

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

     stopwatch.Start(); 

     ///Do your wwork here 

     var timeElapsed = stopwatch.Elapsed; 
    } 

GÜNCELLEME, ne olmuş yani? Eğer iplik uyku kullanıyorsanız işe yaramaz. Üzgünüm, bu hala aradığınız şey değilse.

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 OP'nin sorduğu bu değil. – tnw

+0

Orada. – Marco

+0

Burada bir işlem değil, bir iş parçacığı ölçüyorsunuz, bu nedenle OP'nin aradığı cevap bu değil. –

1

PerformanceCounters'a bakmalısınız. Oldukça karmaşıktırlar ve kurmak için biraz acı çekebilirler, ancak metrikler için sundukları şeylere karşı sağlamdırlar. yardımcı olabilecek birkaç şey: Yapamazsın

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

Bunun yalnızca geçerli iş parçacığı için nasıl ölçüleceğini göremiyorum. – Horcrux7

1

. Belirli bir thread için CPU AÇIK birikmiş zamanı ölçemezsiniz. Yapabileceğiniz en doğru şey, her bir göreviniz için ayrı bir process döndürmek ve daha sonra işlem için (aslında. Net'de yapılabilen) CPU zamanını ölçmek olacaktır ... ama bu aşırı derecede fazladır.

Bunun nasıl yapılacağı konusunda yardıma ihtiyacınız varsa, bunun için özellikle başka bir soru sormalısınız.

İlgili konular