【问题标题】:Optimization of C++ code - std::vector operationsC++代码优化——std::vector操作
【发布时间】: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


【解决方案1】:

如果大小较大,可以通过预先分配所需空间来改进push_back。在循环之前添加:

XR2.reserve(X.size());
YR2.reserve(X.size());

【讨论】:

  • 我已将 push_back() 替换为 operator[],因为我在某处读到它更快。还是很慢。
猜你喜欢
  • 1970-01-01
  • 2016-11-12
  • 2023-03-07
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
  • 2013-01-17
相关资源
最近更新 更多