2013-04-24 12 views
8

मैं उस समय को मापना चाहता हूं जब सी # दिनचर्या की आवश्यकता हो। क्योंकि कई अन्य धागे हैं, मैं केवल इस धागे के समय को गिनना चाहता हूं। जावा में मैं getCurrentThreadCpuTime का उपयोग कर सकता हूं।मैं सी # में धागे के समय को कैसे माप सकता हूं?

मैं यह कैसे कर सकता हूं?

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

उत्तर

-3

आप इसके लिए स्टॉपवॉच का उपयोग कर सकते हैं। यह प्राप्त करने का सबसे आसान तरीका होगा।

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

     stopwatch.Start(); 

     ///Do your wwork here 

     var timeElapsed = stopwatch.Elapsed; 
    } 

इस बारे में अद्यतन

मैं आपके सवाल का गलत, तो क्या हुआ? यदि आप थ्रेड नींद का उपयोग करते हैं तो यह काम नहीं करता है। क्षमा करें अगर यह अभी भी वह नहीं है जिसे आप ढूंढ रहे हैं।

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 जो ​​ओपी ने पूछा नहीं है। – tnw

+0

जो वहां है। – Marco

+0

आप यहां एक ऑपरेशन को माप रहे हैं, थ्रेड नहीं, इसलिए यह उत्तर ओपी की तलाश में नहीं है। –

1

आपको PerformanceCounters में देखना चाहिए। वे काफी जटिल हैं और स्थापित करने के लिए दर्द का थोड़ा सा हो सकता है, लेकिन वे मेट्रिक्स के लिए जो पेशकश करते हैं उसमें मजबूत हैं। कुछ बातें है कि मदद कर सकता है:

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

मैं नहीं देख सकता कि यह केवल वर्तमान धागे के लिए कैसे मापना चाहिए। – Horcrux7

1

आप नहीं कर सकते। आप किसी विशेष thread के लिए CPU पर संचित समय को माप नहीं सकते हैं। सबसे सटीक चीज जो आप कर सकते हैं, अपने प्रत्येक कार्य के लिए अलग process को स्पिन करना होगा, और फिर प्रक्रिया के लिए CPU समय को मापना होगा (जो वास्तव में .Net में किया जा सकता है) ... लेकिन यह अधिक है।

यदि आपको ऐसा करने के तरीके पर सहायता चाहिए, तो आपको इसके लिए विशेष रूप से एक और प्रश्न पूछना चाहिए।

संबंधित मुद्दे