我想测量 C# 例程所需的时间。因为还有很多其他线程我只想统计这一个线程的时间。在 Java 中,我可以使用getCurrentThreadCpuTime
.
我该怎么做?
我想测量 C# 例程所需的时间。因为还有很多其他线程我只想统计这一个线程的时间。在 Java 中,我可以使用getCurrentThreadCpuTime
.
我该怎么做?
你不能。您无法测量特定的 CPUthread
上的累积时间。您可以做的最准确的事情是process
为您的每个任务分离一个单独的任务,然后测量进程的 CPU 时间(实际上可以在.Net 中完成)......但这有点矫枉过正。
如果您需要有关如何做到这一点的帮助,您应该专门为此提出另一个问题。
您应该查看PerformanceCounters。它们非常复杂,设置起来可能有点麻烦,但它们为指标提供的功能很强大。有几件事可能会有所帮助:
您可以为此使用秒表。这将是最简单的方法。
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();
}
}