背景
- 一次性获取所有进程信息的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
。
原先我猜想单项资源查询接口内部可能存在无效的轮询逻辑等,然而实际结果和预期不符。
因此如果只关注进程的主要指标,可以通过分别调用单项资源查询接口来节省功耗。