[英]Optimize small 3d vector struct for performance
我是C ++的新手,有以下内容,让我们称之为问题。 在我的计算机模拟中,我使用矢量工作了很多。 我自己构建了一个表示向量的小结构,并想学习如何进行操作(例如normalize()
函数更有效。另外,使用C ++的valarray
有什么好处吗?它似乎有一些用处方法预先实施。
我几乎只使用normalize()
函数和向量的加/减/乘。 由于我的所有向量只有三个元素,我对在项目中包含第三方库犹豫不决。
这是我的结构:
struct vector_t {
int _i, _j, _k;
vector_t(int i, int j, int k) {
_i = i;
_j = j;
_k = k;
}
vector_t() {}
inline int getI() {
return _i;
}
inline int getJ() {
return _j;
}
inline int getK() {
return _k;
}
inline void setI(int val) {
_i = val;
}
inline void setJ(int val) {
_j = val;
}
inline void setK(int val) {
_k = val;
}
void normalize() {
float length = sqrt(_i*_i + _k*_k + _j*_j);
_i /= length;
_j /= length;
_k /= length;
}
};
我的问题是:
normalize()
函数或者这是否是最有效的方法? 使用快速倒数平方根函数计算1 /长度,然后将每个元素乘以此因子。 除了比sqrt
更快的功能之外,这还有3个相对便宜的乘法交易3个昂贵的除法运算:
struct vector_t {
float _i, _j, _k;
// ...
void normalize() {
float r_length = Q_rsqrt(_i*_i + _k*_k + _j*_j);
_i *= r_length;
_j *= r_length;
_k *= r_length;
}
};
注意:您可能想要考虑如何处理i == j == k == 0
的病态情况。
这不会有很大的不同,但你的构造函数应该是这样的:
vector_t(int i, int j, int k)
: _i(i), _j(j), _k(k)
{
}
为了优化,您应该查看SSE: http : //www.cortstratton.org/articles/OptimizingForSSE.php
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.