注册表调用的效率vs.将用户选项存储在静态变量中
Efficiency of registry call vs. storing user options in a static variable
我有一个程序,在注册表中存储一些用户选项(大约5个选项)。这些选项是从内联函数中的注册表中获取的。在运行时需要多次检查这些选项。更具体地说,在一个例程中可能被调用100次以上的函数中检查选项。
我的问题是哪个更有效率:1)调用内联函数,该函数每次需要检查选项时都从注册表中获取该选项;或2)调用一次内联函数,然后将结果存储在一个静态变量中,该变量将用于检查选项。
请注意,我不关心在运行时更改选项,因为它们很少更改,并且直到下次运行程序才需要生效。
从理论上的性能角度来看,很明显,缓存的变量将比重复的注册表访问(这会导致系统调用,甚至可能是磁盘I/O,而不是缓存设置时的内存访问)更有效。但正如@MarkRansom在评论中所指出的那样,100次注册表访问不太可能对程序的性能产生重大影响,除非您的例程经常被调用(例如。
与任何性能/优化问题一样:除非您确实知道这会导致性能问题,否则您不应该费心。您的分析器会这样告诉您,或者您可以自己轻松地证明这一点)。然而,还有另一个问题。
你说"我不关心在运行时更改选项",但恕我直言,你应该:如果用户在程序执行时更改选项会发生什么?我的意思是,你已经开始了一个基于特定选项的计算,这些选项产生了特定的假设,突然之间,选项改变了。它很容易弄乱你的不变量/假设,并引入相干性问题。
因此,与性能问题无关,您应该始终将用户定义的设置缓存在变量中,以便如果它们在运行时被用户修改,您的程序保持一致。
换句话说,对我来说,这不是性能问题,而是程序正确性问题。
@CaptainObvlious提出了一个有趣的观点:如果您实际上需要在用户(或其他应用程序)更改设置时更新它们,那么以受控的方式进行(正如他建议的那样,监控注册表是一种方式),并仅在适合这样做时更新缓存的变量。这可以确保您的设置不会在计算过程中发生变化,因为该计算实际上期望始终使用相同的设置。
最好的选择是将设置缓存到变量中。当你读取这个值时,你最终会得到一个(单一的)加载指令,而不是调用一个系统API,它可能会做文件I/O或其他耗时的任务来检索这个值。如果您确实需要处理由外部应用程序更新的设置,您可以始终监视注册表的更改—这可能需要为多线程访问提供额外的锁。即使这样,性能仍然比总是读取注册表要好得多。
关于程序正确性的一些考虑,请参见syam的回答。[/p>- 如何为静态常量模板化专用整数值分配存储
- 为什么具有静态存储持续时间的同一内联变量在包含在 VS2017 编译的两个翻译单元中时会构造和销毁两次
- 具有静态存储持续时间的常量初始化变量的初始化顺序
- 静态存储类C++计数
- 如果静态变量只为程序的整个部分存储了一个副本,为什么我不能使用静态变量交换 2 个数字?
- 存储指向静态变量的指针
- c++ 类中的静态常量变量和常量变量在存储方面是否有区别
- 静态存储中的内联变量何时初始化?
- 静态存储持续时间初始化
- 将静态空隙方法存储为函数
- 线程上下文上的静态存储对象优化
- 在不同翻译单元中具有静态存储持续时间的依赖非局部常量浮点变量的常量初始化
- 将存储类声明为主机类中的静态成员
- 为什么工会静态成员不存储为工会?
- 什么是静态存储持续时间的临时对象
- 是否可以存储一个在静态容器中包含unique_ptr的对象
- 将对静态存储 cstyle 数组的引用从 constexpr 函数传递到另一个 constexpr 函数
- C++17:是编译器为(静态存储持续时间)const引用绑定创建的可修改的临时对象(和存储)
- 将sf::纹理存储在dll中的静态变量中
- 其中在存储器中存储静态变量