You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:51:17