用g ++编译这个函数是有效的,但速度很慢。
void rota(double psir,double thetar,double phir,double xi,double yi,double zi,double *xf,double *yf,double *zf) {
*xf = xi*cos(phir)*cos(psir)+yi*(-sin(phir)*cos(thetar)*cos(psir)+sin(thetar)*sin(psir))+zi*(sin(phir)*sin(thetar)*cos(psir)+cos(thetar)*sin(psir));
*yf = xi*sin(phir)+yi*cos(phir)*cos(thetar)-zi*cos(phir)*sin(thetar);
*zf = -xi*cos(phir)*sin(psir)+yi*(sin(thetar)*cos(psir)+cos(thetar)*sin(phir)*sin(psir))+zi*(cos(thetar)*cos(psir)-sin(thetar)*sin(phir)*sin(psir));
return;
}
如果我计算一次中间值,然后调用它们,我的模拟运行多更快。
void rota(double psir,double thetar,double phir,double xi,double yi,double zi,double *xf,double *yf,double *zf) {
double cosf = cos(phir);
double sinf = sin(phir);
double cosp = cos(psir);
double sinp = sin(psir);
double cost = cos(thetar);
double sint = sin(thetar);
*xf = xi*cosf*cosp+yi*(-sinf*cost*cosp+sint*sinp)+zi*(sinf*sint*cosp+cost*sinp);
*yf = xi*sinf+yi*cosf*cost-zi*cosf*sint;
*zf = -xi*cosf*sinp+yi*(sint*cosp+cost*sinf*sinp)+zi*(cost*cosp-sint*sinf*sinp);
return;
}
为什么g ++不为我做这个优化?我有办法更有效地做到这一点吗?
谢谢!
答案 0 :(得分:3)
我使用gcc 4.7.2
使用-O3
编译了代码。在这两种情况下,生成的x86_64
程序集几乎相同。
然后我通过称它为100,000,000次对每个函数进行基准测试。
第一个版本:
real 0m0.216s
user 0m0.213s
sys 0m0.002s
而第二次采取:
real 0m0.216s
user 0m0.212s
sys 0m0.002s
得出你自己的结论。