(这与我经常提出的基本编程问题无关!)
我们有一个有趣的问题。我们有一个多线程非可视服务器应用程序(每个进程运行10-20个工作线程),它使用了大量的CPU。这是设计的。
我们无法在开发人员系统上分析此代码的实际工作量。工作量高度(非常高)杂色。为了优化这段代码,我们需要能够让生产位记录哪些工作者的工作需要多少CPU。
我们当前的实现使用System.Diagnostics.ProcessThread.TotalProcessorTime进行测量,但在.NET v4中并不保证逻辑.NET线程与ProcessThread的亲和性,因此我们无法确定我们究竟在测量什么
我们可以做些什么来衡量每个线程/每个函数的CPU使用情况?
我们听说线程的替代lib是单向的,有什么建议吗?
答案 0 :(得分:8)
ProcessThread和Thread之间的分割是从.NET 2.0开始的。灵感来自SQL Server团队内部计划使用光纤实现.NET线程的项目。该项目被放弃,没有已知的CLR主机不使用操作系统线程(也称为ProcessThread)来实现.NET线程。
您唯一的问题是将ProcessThread与.NET线程相匹配。这在.NET 2.0中是有目的的。唯一不错的方法是让Thread本身对GetCurrentThreadId()进行pinvoke,然后找到与ProcessThread.Id的匹配。一旦你在那里,你也可以调整GetThreadTimes()。这也要求OpenThread()获取句柄,而CloseHandle()再次关闭它。访问pinvoke.net获取声明。