C++中shlwapi.h内置函数SHGetValueA性能如何?如何选型及测速?
测试SHGetValue执行速度与方案选择
测试SHGetValue执行速度的具体方法
要准确测试该函数的执行速度,推荐结合Windows平台的高精度计时工具与多次执行取平均的方式,避免单次测试的误差:
1. 高精度计时实现
使用QueryPerformanceCounter和QueryPerformanceFrequency获取纳秒级计时精度,代码示例如下:
#include <windows.h> #include <iostream> #include <string> // 修正原代码未定义变量问题后的注册表读取函数 int ReadUACRegistryKey(LPCWSTR key) { LPCWSTR pszSubKey, pszValue = key; const std::wstring sPath = L"XXXXXXXXXXX"; pszSubKey = sPath.c_str(); // 原代码sSearchPattern未定义,此处假设为sPath DWORD dwType = 0; DWORD dwValue = 0; DWORD dwValueSize = sizeof(dwValue); int retval = SHGetValue(HKEY_LOCAL_MACHINE, pszSubKey, key, &dwType, &dwValue, &dwValueSize); if (retval != ERROR_SUCCESS) { std::wcerr << L"ERROR: Failed to retrieve Registry setting" << std::endl; } return dwValue; } int main() { const int testCount = 10000; // 执行10000次,可根据需求调整次数 LARGE_INTEGER start, end, freq; QueryPerformanceFrequency(&freq); QueryPerformanceCounter(&start); for (int i = 0; i < testCount; ++i) { ReadUACRegistryKey(L"YourTargetValueName"); // 替换为实际要读取的键名 } QueryPerformanceCounter(&end); double elapsedSeconds = (double)(end.QuadPart - start.QuadPart) / freq.QuadPart; double avgMsPerCall = (elapsedSeconds * 1000) / testCount; std::cout << "总耗时: " << elapsedSeconds << " 秒" << std::endl; std::cout << "单次调用平均耗时: " << avgMsPerCall << " 毫秒" << std::endl; return 0; }
2. 测试关键注意事项
- 多次执行取平均:单次注册表读取受系统负载影响波动大,执行几千甚至几万次取平均值更能反映真实性能。
- 模拟真实场景:测试时尽量还原程序实际运行的系统状态(比如是否有其他进程读写注册表),避免空闲系统下的结果与实际场景偏差过大。
- 对比缓存方案:同时测试缓存后的读取速度(比如将值存在全局/静态变量中直接返回),对比两者耗时差异,判断缓存是否有必要。
方案选择建议
- 如果程序仅在初始化或极少场景下读取该注册表值,直接调用
SHGetValue更简单,无需额外缓存逻辑。 - 如果频繁读取该值(比如循环内多次调用),且测试发现单次读取耗时明显影响性能,缓存注册表值是更优选择。需注意:若该注册表值可能被其他程序修改,缓存时要考虑定期刷新的逻辑。
内容的提问来源于stack exchange,提问作者Sumit Sahu
相关产品推荐
相关产品推荐

