【发布时间】:2016-08-04 22:19:45
【问题描述】:
我有这个函数 (RotateSlownessTop),它被调用了大约 800 次来计算相应的值。但是计算速度很慢,有没有办法可以使计算更快。
X/Y 的元素个数是 7202。(相当大的集合)
我做了性能分析,截图已附上。
void RotateSlownessTop(vector <double> &XR1, vector <double> &YR1, float theta = 0.0)
{
Matrix2d a;
a(0,0) = cos(theta);
a(0,1) = -sin(theta);
a(1, 0) = sin(theta);
a(1, 1) = cos(theta);
vector <double> XR2(7202), YR2(7202);
for (size_t i = 0; i < X.size(); ++i)
{
XR2[i] = (a(0, 0)*X[i] + a(0, 1)*Y[i]);
YR2[i] = (a(1, 0)*X[i] + a(1, 1)*Y[i]);
}
size_t i = 0;
size_t j = 0;
while (i < YR2.size())
{
if (i > 0)
if ((XR2[i]>0) && (XR2[i-1]<0))
j = i;
if (YR2[i] > (-1e-10) && YR2[i]<0.0)
YR2[i] = 0.0;
if (YR2[i] < (1e-10) && YR2[i]>0.0)
YR2[i] = -YR2[i];
if ( YR2[i]<0.0)
{
YR2.erase(YR2.begin() + i);
XR2.erase(XR2.begin() + i);
--i;
}
++i;
}
size_t k = 0;
while (j < YR2.size())
{
YR1[k] = (YR2[j]);
XR1[k] = (XR2[j]);
YR2.erase(YR2.begin() + j);
XR2.erase(XR2.begin() + j);
++k;
}
size_t l = 0;
for (; k < XR1.size(); ++k)
{
XR1[k] = XR2[l];
YR1[k] = YR2[l];
l++;
}
}
Edit1:我已通过将所有 push_back() 替换为 operator[] 来更新代码,因为我在某处读到这要快得多。 但是整个程序仍然很慢。任何建议表示赞赏。
【问题讨论】:
-
vector::reserve可能会有所帮助。 -
您是在运行调试构建还是发布(优化构建)?如果它是调试版本,那么您的结果将毫无意义。请发布您使用的编译器优化设置。 Visual Studio 尤其如此,因为调试版本会在 STL 容器类中进行大量迭代器检查。
-
@PaulMcKenzie 我正在发布。设置是: 优化:最大化速度(/O2) 内联函数扩展:默认 启用内部函数:是(/Oi) 偏好大小或速度:两者都没有 省略帧指针:否(/Oy-) 启用光纤安全优化:没有整体程序优化:是(/GL)
-
在高层次上,你想用第一个和第二个
while循环来完成什么?不管它是什么,它看起来肯定是一个算法函数可以完成这项工作,而不是手动编码的循环。此外,每次调用erase时,向量都必须移动元素以覆盖创建的孔。这本身可能是一个瓶颈(如果是erase导致您看到的问题,而不是reserve或[ ],我不会感到惊讶。
标签: c++ visual-studio optimization