缓存计算vs重复计算:何时选择缓存的经验法则探讨
热力学计算应用的缓存性能测试与思考
我开发了一款计算不同压力、温度下热力学性质的应用,部分(压力&温度)组合会被重复计算。单次计算包含28次乘法、7次除法、1次平方根、1次平方、1次指数运算、11次加法及若干减法。
为优化性能,我尝试将已计算的(温度<=>压力)组合结果存入字典,后续调用时先检查字典再决定是否重新计算。初始测试显示:无缓存时2500万次迭代平均耗时约6.1秒;启用缓存后耗时直接减半。
为贴近真实场景,我保持总迭代次数不变,测试不同温度数量的缓存效果:
| 场景 | 耗时 |
|---|---|
| 无缓存 | 6,180 ms |
| 缓存+固定温度 | 3,255 ms |
| 缓存+100种温度 | 3,203 ms |
| 缓存+1,000种温度 | 3,189 ms |
| 缓存+10,000种温度 | 3,416 ms |
| 缓存+100,000种温度 | 3,743 ms |
结果显示这个场景下缓存始终更高效,但我推测计算量较小时可能并非如此。于是针对100,000种温度的场景,测试不同计算逻辑的性能:
计算逻辑:每次迭代执行10次双精度浮点数乘法
| 场景 | 耗时 |
|---|---|
| 无缓存 | 1,514 ms |
| 缓存+100,000种温度 | 3,646 ms |
乘法、除法、加减运算的测试结果相近。
计算逻辑:每次迭代执行10次双精度浮点数幂运算(Math.Pow())
| 场景 | 耗时 |
|---|---|
| 无缓存 | 7,150 ms |
| 缓存+100,000种温度 | 3,780 ms |
计算逻辑:每次迭代执行10次指数运算(Math.Exp(double))
| 场景 | 耗时 |
|---|---|
| 无缓存 | 5,535 ms |
| 缓存+100,000种温度 | 3,766 ms |
计算逻辑:每次迭代执行10次平方根运算(Math.Sqrt(double))
| 场景 | 耗时 |
|---|---|
| 无缓存 | 1,378 ms |
| 缓存+100,000种温度 | 3,673 ms |
通过这些测试我产生了疑问:有没有判断缓存是否值得使用的经验法则?比如基于运算类型、运算次数及调用频率的公式?还是说,最佳方案就是针对代码各部分用真实输入做基准测试?
内容的提问来源于stack exchange,提问作者ainwood
相关产品推荐
相关产品推荐

