翻译《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,一经查实,立即删除!

相关文章

使用 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)。…

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

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

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作为企业网关部署在网络…

华为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…

云手机:海外舆情监控的新工具

在数字化时代&#xff0c;海外舆情监控对于企业、品牌和政府机构来说&#xff0c;已经变得至关重要。传统的舆情监控方法往往受限于地域、设备和技术&#xff0c;而云手机的出现&#xff0c;为海外舆情监控带来了全新的解决方案。 一、云手机与海外舆情监控的完美结合 云手机作…

Flask 通过SQLAlchemy连接mySQL实现一个实用的用户管理功能

Flask 通过SQLAlchemy连接mySQL实现一个实用的用户管理功能 安装配置 首先确保已经安装如下程序&#xff1a; flask&#xff1a;用于构建web应用程序。flask-sqlalchemy&#xff1a;用于在 Flask 中连接 MySQL 数据库&#xff0c;通过pip install flask-sqlalchemy安装。pym…

Web安全:SQL注入漏洞详解,SQL注入常见功能、危害、分类、判断注入点、注入方式

「作者简介」:2022年北京冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础对安全知识体系进行总结与归纳,著作适用于快速入门的 《网络安全自学教程》,内容涵盖系统安全、信息收集等12个知识域的一百多个知识点,持续更新。 这一章节我们需要知道S…

FPGA+炬力ARM实现VR视频播放器方案,3D眼镜显示

3D眼镜显示&#xff1a; FPGA炬力ARM方案&#xff0c;单个视频源信号&#xff0c;同时驱动两个LCD屏显示&#xff0c;实现3D 沉浸式播放 客户应用&#xff1a;VR视频播放器 主要功能&#xff1a; 1.支持多种格式视频文件播放 2.支持2D/3D 效果实时切换播放 3.支持TF卡/U盘文…

24数维杯C题18页保姆级思路+代码+后续参考论文

18页保姆级思路&#xff1a; 24数维杯C题20页保姆级思路&#xff0b;可执行代码&#xff0b;参考论文 简单麦麦https://www.jdmm.cc/file/2710641/ 群&#xff1a;666165284 1&#xff09;确定天然气水合物资源分布范围 要确定天然气水合物资源的分布范围&#xff0c;需要分…

谷歌上架,白包号放着备用,啥也没干也被封?是什么情况?

众所周知&#xff0c;Google Play Store是全球最大的应用商店之一&#xff0c;每天都有大量的应用被上传和下架。 同时&#xff0c;随着谷歌上架行业的发展&#xff0c;谷歌现在的审核系统越来越智能和先进&#xff0c;开发者们尝试着各种方法来提高上架成功率。其中&#xff…

提升工作效率的秘密武器

&#x1f31f;工作小能手们&#xff0c;你们是否还在为日复一日的办公琐事感到头疼&#xff1f;别急&#xff0c;今天我就为大家种草几款鲜为人知但超级实用的工作软件&#xff0c;让你的工作效率飞起来&#xff01;&#x1f308; 1️⃣《亿可达》 &#x1f5a5;️ 它是一款自…