注册表调用的效率vs.将用户选项存储在静态变量中

Efficiency of registry call vs. storing user options in a static variable

本文关键字:存储 静态 变量 用户选项 调用 效率 vs 注册表      更新时间:2023-10-16

我有一个程序,在注册表中存储一些用户选项(大约5个选项)。这些选项是从内联函数中的注册表中获取的。在运行时需要多次检查这些选项。更具体地说,在一个例程中可能被调用100次以上的函数中检查选项。

我的问题是哪个更有效率:1)调用内联函数,该函数每次需要检查选项时都从注册表中获取该选项;或2)调用一次内联函数,然后将结果存储在一个静态变量中,该变量将用于检查选项。

请注意,我不关心在运行时更改选项,因为它们很少更改,并且直到下次运行程序才需要生效。

从理论上的性能角度来看,很明显,缓存的变量将比重复的注册表访问(这会导致系统调用,甚至可能是磁盘I/O,而不是缓存设置时的内存访问)更有效。但正如@MarkRansom在评论中所指出的那样,100次注册表访问不太可能对程序的性能产生重大影响,除非您的例程经常被调用(例如。

与任何性能/优化问题一样:除非您确实知道这会导致性能问题,否则您不应该费心。您的分析器会这样告诉您,或者您可以自己轻松地证明这一点)。

然而,还有另一个问题。

你说"我不关心在运行时更改选项",但恕我直言,你应该:如果用户在程序执行时更改选项会发生什么?我的意思是,你已经开始了一个基于特定选项的计算,这些选项产生了特定的假设,突然之间,选项改变了。它很容易弄乱你的不变量/假设,并引入相干性问题。

因此,与性能问题无关,您应该始终将用户定义的设置缓存在变量中,以便如果它们在运行时被用户修改,您的程序保持一致。

换句话说,对我来说,这不是性能问题,而是程序正确性问题。

@CaptainObvlious提出了一个有趣的观点:如果您实际上需要在用户(或其他应用程序)更改设置时更新它们,那么以受控的方式进行(正如他建议的那样,监控注册表是一种方式),并仅在适合这样做时更新缓存的变量。这可以确保您的设置不会在计算过程中发生变化,因为该计算实际上期望始终使用相同的设置。

最好的选择是将设置缓存到变量中。当你读取这个值时,你最终会得到一个(单一的)加载指令,而不是调用一个系统API,它可能会做文件I/O或其他耗时的任务来检索这个值。如果您确实需要处理由外部应用程序更新的设置,您可以始终监视注册表的更改—这可能需要为多线程访问提供额外的锁。即使这样,性能仍然比总是读取注册表要好得多。

关于程序正确性的一些考虑,请参见syam的回答。[/p>