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

Pau*_*aul 4 c++ windows

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

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

请注意,我不关心在运行时更改选项,因为它们很少更改,并且在下一次运行程序之前无需生效.

任何反馈都将受到高度赞赏.

sya*_*yam 10

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

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


但是,还有另一个问题.

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

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

换句话说,对我来说,不仅仅是表现问题,而是程序正确性问题.

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


Cap*_*ous 8

您最好的选择是在变量中缓存设置.当您读取该值时,您将最终使用(单个)加载指令与调用系统API,该系统API可能会执行文件I/O或其他耗时的任务来检索该值.如果确实需要处理外部应用程序正在更新的设置,则可以始终监视注册表以进行更改 - 这可能需要额外的锁以进行多线程访问.即便如此,性能仍将远远高于总是阅读注册表.

[ 有关程序正确性的一些考虑,请参阅syam的答案.对于相互影响的多个设置,您应该记住这一点.]