【发布时间】:2019-07-16 22:02:03
【问题描述】:
AFAIK 在大多数情况下,sqrt 操作都很昂贵。 下面对向量的测试是否已经是长度为 1 且具有 epsilon 的值?是不是省了很多。如果 normalize 经常在已经标准化的向量上调用。如果不是,是不是太贵了?
double Vec3d::normalize() {
double mod = x * x + y * y + z * z;
if (mod == 0) {
return(0);
}
if (consideredEqual(mod, 1.0, .0000001)) { // is this test worth it ???
return(1.0);
}
mod = std::sqrt(mod);
x /= mod;
y /= mod;
z /= mod;
return mod;
}
【问题讨论】:
-
无论何时在这里询问性能 - 自己首先测试代码。
-
这取决于您的输入的统计分布。你希望我们怎么知道?
-
由于缓存命中等原因,在这种环境中相当困难。我认为很多人在通用平台上都这样做了,因为所有 3D 图形都需要这个,所以很多人会立即得到是/否的答案。否则我必须编写一个特殊的测试程序等。一旦发布答案,希望其他有相同问题的人可以轻松找到它(我没有)
-
对我来说是典型的带有数学协处理器和标准 C++ 库的英特尔 64 位 PC。
-
最好的了解方法是编写基准测试。坦率地说,这可能比写一个问题并等待回复要快。