【windows】测试获取进程资源占用的API的性能消耗

背景

  • 一次性获取所有进程信息的API:NtQuerySystemInformation
  • 分别获取进程的cpu、mem、io的API:GetProcessTimes、GetProcessMemoryInfo、GetProcessIoCounters
    如果关注进程的cpu/mem/io占用情况,调用哪个接口更省资源?

实验

起两个线程,一个线程中循环调用NtQuerySystemInformation 1W次; 一个线程中先获取到所有进程的handle,然后调用3个单独获取资源的接口1W次。观察谁能更快执行完?

结果

函数名 CPU 总计[单位,%] 自 CPU [单位,%] 模块
| - TestNtQuerySystemInformation 22144 (56.31%) 1 (0.00%) PerformanceTest.exe
| - TestSysPerf 16533 (42.04%) 4 (0.01%) PerformanceTest.exe

函数名 CPU 总计[单位,%] 自 CPU [单位,%] 模块
| - [外部调用] NtQuerySystemInformation 21561 (54.82%) 21561 (54.82%) ntdll.dll
| - [外部调用] GetProcessIoCounters 6733 (17.12%) 6733 (17.12%) kernel32.dll
| - [外部调用] GetProcessTimes 4399 (11.19%) 4399 (11.19%) KernelBase.dll
| - [外部调用] K32GetProcessMemoryInfo 2593 (6.59%) 2593 (6.59%) KernelBase.dll

结果是NtQuerySystemInformation会消耗更多资源,其他3个接口相加仍然小于NtQuerySystemInformation
原先我猜想单项资源查询接口内部可能存在无效的轮询逻辑等,然而实际结果和预期不符。
因此如果只关注进程的主要指标,可以通过分别调用单项资源查询接口来节省功耗。

posted @ 2023-02-25 11:44  mooooonlight  阅读(150)  评论(0编辑  收藏  举报