使用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++不为我做这种优化?我有办法更有效地做到这一点吗?

谢谢!

最佳答案

我已经使用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

得出自己的结论。

关于c++ - 为什么我会看到这些功能之间的巨大性能差异?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15885690/

10-11 18:48