性能计数器读取访问速度非常慢 – 任务管理器如何执行此操作?

我试图实现一个性能监视工具,我想监视内存和CPU等基本内容。

我试图通过使用性能计数器这样做,因为我相信这也是任务管理器在幕后使用的。 我不知道任务管理器是如何做到这一点的,但对我而言,使用此方法检索过程数据似乎需要花费很长时间:

class Program { static void Main(string[] args) { while (true) { var pcs = Process.GetProcesses() .Select(p => new PerformanceCounter("Process", "Working Set - Private", p.ProcessName)); var sw = Stopwatch.StartNew(); foreach (var pc in pcs) pc.NextValue(); Console.WriteLine($"Time taken to read {pcs.Count()} performance counters: {sw.ElapsedMilliseconds}ms"); Thread.Sleep(1000); } } } 

在此处输入图像描述

有没有人有任何关于如何做到这一点或任务管理器或Process Explorer如何做到这一点的建议?

任务管理器如何做到这一点?

他使用了对ZwQuerySystemInformationZwQueryInformationProcessZwQueryInformationThread 。任务管理器维护活动进程的数据库,并通过调用ZwQuerySystemInformation(SystemProcessInformation,)定期更新此信息 – 因此在退出时得到SYSTEM_PROCESS_INFORMATION数组。 添加新条目(如果找到新进程,但不在DB ,删除死亡进程的条目,更新已存在的SYSTEM_PROCESS_INFORMATION信息,其中包含很多进程信息。 可以通过打开的进程获取其他信息,并使用适当的信息类调用ZwQueryInformationProcess

如果你想实现一个性能监控工具,没有“量子效应”(当测量影响状态本身时),你需要使用这个ntdll api。 对于定义,请查看http://processhacker.sourceforge.net/doc/ntexapi_8h_source.html,尽管这是未记录的,现有的function和结构没有改变如何从win2000最小化(所以〜17年) – 新版本的Windows添加了很多新信息类,旧版本中备用/未使用的某些字段 – 可以使用,但旧版(旧版)不会更改

Interesting Posts