翻译《The Old New Thing》 - The performance cost of reading a registry key

The performance cost of reading a registry key - The Old New Thing (microsoft.com)icon-default.png?t=N7T8https://devblogs.microsoft.com/oldnewthing/20060222-11/?p=32193

Raymond Chen 2006年2月22日


读取注册表键的性能成本

        注册表是一个方便的场所,它以统一且多线程安全的方式记录了跨进程的持久数据。如果将数据存储在 HKEY_CURRENT_USER 下,它还可以随用户漫游,并且即使在不支持安全性的FAT文件系统上,也可以对单个键进行安全设置。

        但这并不意味着它是零成本的。打开一个键、读取一个值、然后关闭它的操作大约需要60,000到100,000个CPU周期(据我了解)。这是在假设你访问的键已经在缓存中的情况下。如果你保持键打开的状态,那么读取值的操作成本会降低到大约15,000到20,000个CPU周期。(这些数字是基于Windows XP的估算;实际的性能可能有所不同。)

        因此,你不应该在程序的核心循环中读取注册表键。这不仅会在查询时消耗CPU时间,而且频繁地访问注册表意味着用于定位和存储你的键的数据结构(包括注册表缓存中的条目)会被保留在系统的活动工作集中。不要在每次鼠标移动事件中都读取注册表键;你应该一次性读取值并将其缓存起来。如果你担心程序运行期间有人更改了该值,你可以建立一个协议,让人们在想要更改设置时遵循。例如,Windows使用如 SystemParametersInfo 这样的函数来操作那些通常被缓存而不是每次需要时都直接从注册表中读取的设置。调用更新函数可以同时更新注册表和内存中的缓存。

        在可能的情况下,应该针对常见情况进行优化,而不是罕见情况。常见情况是注册表的值没有变化。通过使用通知机制,你可以将“如果值改变了怎么办?”的成本从核心循环中转移出去,转移到大多数时候不会执行的代码中。(记住,最快的代码是没有运行的代码。)

        当然,你不会希望让一个线程一直等待通知事件。我建议使用线程池。RegisterWaitForSingleObject 函数允许你向线程池发出请求:“嘿,当这个对象被触发时,请呼叫我,好吗?”线程池随后会将这个请求与其他所有它被要求等待的句柄结合起来,统一进行 WaitForMultipleObjects 调用。这样,一个线程就可以同时处理多个等待事件。

        使用 RegNotifyChangeKeyValue 函数时需要注意的一点是,通知具有线程亲和性!如果调用 RegNotifyChangeKeyValue 函数的线程终止,通知将被激发。这意味着你不应该从线程池中的线程调用此函数,因为系统会在线程池的工作列表空闲且不再需要时销毁线程。如果你错误地从线程池线程调用它,你会发现事件会不断地错误触发,因为线程池的清理代码在运行,这可能使问题变得更糟!相反,你应该从一个持久的线程(比如,真正关心该值的线程)创建等待,并在那里注册等待。当线程池中的事件触发时,处理更改,然后让你的持久线程启动 RegNotifyChangeKeyValue 的新周期。这样一来,事件总是与你持久的线程相关联,而不是与临时的线程池线程相关联。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/9559.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot习题

第1章 一、填空题 1.Pivotal团队在原有 Spring 框架的基础上开发了全新的 Spring Boot 框架。 2.Spring Boot框架在开发过程中大量使用 约定优先配置 的思想来摆脱框架中各种复杂的手动配置。 3.Spring Boot2.1.3 版本要求 Java 8 及以上版本的支持…

【机器学习第二期】MATLAB实现随机森林法

随机森林(Random Forest, RF) 1 原理1.1 重采样方法(Bootstrap resampling method)1.2 特征重要性方法排列重要性法(Permutation Importance method)2 MATLAB相关函数:TreeBagger3 案例:干旱驱动因子分析3.1 案例说明结果变量(Outcome variable)解释变量类别3.2 基于…

使用 MSYS2 Qt6 发布绿色版的SDR软件无线电应用

文章目录 概要整体架构流程技术名词解释技术细节在启动器中为子进程设置路径和环境。如何迅速找齐所有的DLL 小结附件 概要 新接触软件定义无线电(SDR)的朋友一般都会一股脑的安装一些现有的SDR平台。无论是GNURadio还是SDR、SDRSharp、SDRAngel&#x…

上海企业源代码防泄密解决方案,企业源代码防泄密如何应对?

随之互联网的发展,企业员工因离职把企业源代码泄露或删库跑路的事情屡见不鲜,各大互联网公司基本都会出现源代码泄露的事情,这样的问题也成了企业在发展过程中不可避免的问题。企业源代码泄露会给企业带来的损失也是不可估量的,据…

C++map和set(个人笔记)

Cmap和set 1.set1.1set的使用1.1.1 set的模板参数列表1.1.2set的构造1.1.3set的迭代器1.1.4 set的容量1.1.5 set修改操作1.1.6 set的具体使用例子 2.map2.1map的使用2.1.1map的模板参数列表2.1.2map的构造2.1.3map的迭代器2.1.4 map的容量与元素访问2.1.5 map中元素的修改2.1.6…

模电·基本共基放大电路

基本共集放大电路 图1.(a)所示为基本共基放大电路,根据放大电路的组成原则,为使晶体管发射结正向偏置且 U B E > U o n {U\tiny BE}>{U\tiny on} UBE>Uon,在其输入回路加电源 V B B V\tiny BB VBB&#xf…

Photoshop中绘图及图像修饰工具的应用

Photoshop中绘图及图像修饰工具的应用 Photoshop中的颜色设置与取样前景色与背景色颜色取样 Photoshop中的颜色替换工具Photoshop中的渐变工具Photoshop中的描边命令Photoshop中的填充工具采用油漆桶进行填充采用填充命令进行填充 Photoshop中的擦除工具 Photoshop中的颜色设置…

SQL子查询练习

学习链接:https://sqlzoo.net/wiki/Window_LAG ● 【题目1】查询在欧洲(Europe)人均gdp大于英国 (United Kingdom)的国家名。人均国内生产总值(人均GDP)国内生产总值(GDP)/人口(populaiton)。…

Ajax 笔记02

01 jq中的ajax方法中的dataType属性 dataType属性的属性值有以下几种: xml 返回数据按照xml解析 json 返回的数据按照json代码解析 script 返回的数据按照js代码解析 text 把返回的数据按照普通文本解析 jsonp 跨域 json: javascript object notation(js对象简谱) json整体…

智能奶柜:健康生活新风尚

智能奶柜:健康生活新风尚 在快节奏的都市生活中,健康与便利成为了现代人的双重追求。而在这两者交汇之处,智能奶柜应运而生,它不仅是科技与生活的完美融合,更是日常营养补给的智慧之选。 清晨的第一缕温暖 —— 新鲜…

企微SCRM营销:解锁客户关系管理新篇章

随着数字化营销的不断深入,企业对于客户关系管理(CRM)的需求也日益增长。企业微信(企微)作为一款功能强大的企业级应用,结合SCRM(社交客户关系管理)的理念,为企业带来了全…

pycharm编译器背景设置

最近,瞎逛的时候发现个好玩的,pycharm竟然可以设置背景了,也不知道是不是我太out了,觉得很有意思,略微记录一下 如下步骤: 第五步:选择自己的图片路径 第六步:设置图片透明度&…

【讲解下迭代加深搜索】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共…

自动驾驶系统中的数据闭环:挑战与前景

目录 自动驾驶概况 1.1自动驾驶分级 1.2自动驾驶国内发展 ​1.3自动驾驶架构模型 数据闭环的意义 2.1 搜集corner case的数据 2.2 提高模型的泛化能力 2.3 驱动算法迭代 数据闭环落地的痛点及对策 3.1 数据采集和使用的合规性问题 3.2 数据确权问题 3.3 数据采集…

Interpreting Super-Resolution Networks with Local Attribution Maps

CVPR2021 问题引入 主要针对的是深度模型的不可解释性,本文使用attribution analysis来分析输入的哪些像素对SR的结果贡献最大;本文提出了Local Attribution Maps,是一种归因方法,延伸了path integral gradient method&#xff…

CLI举例:通过URL分类控制用户访问的网站

华为CLI举例:通过URL分类控制用户访问的网站 配置基于URL分类的URL过滤功能,可以实现对用户访问的某一类网站的控制。既可以是FW自带的预定义分类,也可以是管理员配置的自定义分类。 组网需求 如图1所示,FW作为企业网关部署在网络…

TypeScript的`undefined`作用与使用:初学者指南

TypeScript的undefined作用与使用:初学者指南 大家好我是程序员十一 今天分享一下TypeScript的undefined作用与使用 引言 在JavaScript和TypeScript中,undefined是一个表示变量已声明但尚未被赋予任何值的特殊值。本文将通过一系列实例,由…

华为OD机试【城市聚集度】(java)(200分)

1、题目描述 一张地图上有N个城市,城市和城市之间有且只有一条道路相连,要么直接相连,要么通过其他城市中转相连(可中转一次或多次)。城市与城市之间的道路都不会成环。 当切断通往某城市i的所有道路后,地图上将分成多个连通的城…

mongoDB分组查询

完整代码 //根据医院编号 和 科室编号 &#xff0c;查询排班规则数据Overridepublic Map<String, Object> getRuleSchedule(long page, long limit, String hoscode, String depcode) {//1 根据医院编号 和 科室编号 查询Criteria criteria Criteria.where("hosco…

Zephyr 使用问题记录

文章目录 ...undefined reference to __device_dts_ord_N链接失败解决方案 …undefined reference to __device_dts_ord_N’ 链接失败 提示如下 ...undefined reference to __device_dts_ord_N collect2: error: ld returned 1 exit status解决方案 引自https://docs.zeph…