【发布时间】:2013-03-16 17:40:32
【问题描述】:
我的代码需要不断地从以下函数计算一个值:
inline double f (double x) {
return ( tanh( 3*(5-x) ) *0.5 + 0.5);
}
分析表明程序的这一部分是花费大部分时间的地方。由于该程序将运行数周甚至数月,因此我想优化此操作并考虑使用查找表。
我知道查找表的效率取决于表本身的大小以及它的设计方式。目前我不能使用少于 100 MB 的空间,最多可以使用 2GB。矩阵中两点之间的值将被线性插值。
使用查找表会比计算更快吗?此外,使用 N 维矩阵会比一维 std::vector 更好吗?不应该跨越的表大小的阈值(如果有)是多少?
【问题讨论】:
-
即使该功能是花费大部分时间的地方,是否会损害程序的其余部分?使用表格和外推可能会更快,但值得您的时间进行此优化吗?它会帮助使用您的程序的人吗?请记住,除非使用您的程序的人开始抱怨它运行缓慢,否则您真的需要它吗?
-
我认为,如果您向我们展示相关代码(最好是作为 SSCCE 的一部分 - sscce.org),您将更有可能获得高质量的帮助。否则 IMO 这个问题有点太抽象了。
-
我不能使用少于 10 MB 的空间 - 这是您的老师对您使用查找表的限制吗?这似乎很奇怪。
-
如果您有巨大的查找表(如您所说的数百 MB),它不适合缓存 - 很可能内存查找时间会比计算本身高得多。 RAM“非常慢”。
-
tanhof15 - 3x分别达到 1 和 -1 的水平渐近线大约 1 和 9。你真的只需要为x的一小部分计算它。
标签: c++ performance caching optimization lookup-tables