我有一个程序在注册表中存储一些用户选项(大约 5 个选项)。这些选项是从内联函数中的注册表中获取的。在运行时需要多次检查这些选项。更具体地说,在一个函数中检查选项,该函数在一个例程中可能被调用超过 100 次。
我的问题是哪个更有效:1)每次需要检查选项时,调用从注册表中获取选项的内联函数;或 2) 调用一次内联函数,然后将结果存储在静态变量中,然后将使用该变量检查选项。
请注意,我不关心在运行时更改选项,因为它们很少更改并且不需要在程序下一次运行之前生效。
任何反馈将不胜感激。
从理论上的性能角度来看,缓存变量似乎比重复的注册表访问更有效(这会导致系统调用甚至磁盘 I/O,而不是缓存设置时的内存访问)。但正如@MarkRansom 在评论中所指出的,100 次注册表访问不太可能对您的程序性能产生很大影响,除非您的例程被非常频繁地调用(例如,在一个紧密的循环中)。
像往常一样处理任何性能/优化问题:除非您确实知道这会带来性能问题(例如,您的分析器告诉您,或者您可以轻松地自己证明),否则您不应该打扰。
然而,手头还有另一个问题。
您说“我不关心在运行时更改选项”但恕我直言,您应该:如果用户在程序执行时更改选项会发生什么?我的意思是,你已经开始了基于特定选项的计算,这些选项引发了特定的假设,突然选项发生了变化。它很容易弄乱你的不变量/假设并引入一致性问题。
因此,与性能问题无关,您应该始终将用户定义的设置缓存在变量中,这样如果它们在运行时被用户修改,您的程序就会保持一致。
换句话说,对我来说,这不是性能问题,而是程序正确性问题。
@CaptainObvlious 提出了一个有趣的观点:如果您确实需要在用户(或其他应用程序)更改设置时更新您的设置,那么以受控方式进行(正如他所建议的,监控注册表是一种方式)并更新您的缓存变量只有在合适的时候才这样做。这可确保您的设置不会在计算过程中发生变化,而该计算实际上需要始终相同的设置。
您最好的选择是将设置缓存在变量中。当您读取该值时,您最终会得到一个(单个)加载指令而不是调用一个系统 API,后者可能会执行文件 I/O 或其他耗时的任务来检索该值。如果您确实需要处理由外部应用程序更新的设置,您可以随时监控注册表的更改——这可能需要额外的锁来进行多线程访问。即使这样,性能仍然会比总是读取注册表要好得多。
[有关程序正确性的一些注意事项,请参见syam 的回答。对于相互影响的多个设置,您应该牢记这一点。]