如何在c#中测量线程的时间?

本文关键字:线程 时间 测量 | 更新日期: 2023-09-27 18:10:45

我想测量c#例程所需的时间。因为还有很多其他线程,所以我只想计算这一个线程的时间。在Java中,我可以使用getCurrentThreadCpuTime .

我该怎么做?

如何在c#中测量线程的时间?

您应该查看PerformanceCounters。它们非常复杂,设置起来可能有点痛苦,但它们提供的参数非常强大。以下几点可能会有所帮助:

性能计数器和线程

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

你不能。您无法测量特定thread的CPU上的累积时间。你能做的最准确的事情是为每个任务分离一个单独的process,然后测量进程的CPU时间(这实际上可以在。net中完成)……但这太过分了。

如果你需要帮助,你应该专门问另一个问题。

您可以使用Stopwatch。这是得到它的最简单的方法。

    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();
        }
    }