繁体   English   中英

C ++代码的优化-std :: vector操作

[英]Optimization of C++ code - std::vector operations

在此处输入图片说明

我有这个函数(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:我已经通过用operator []替换了所有push_back()来更新了代码,因为我在某处读到这要快得多。 但是,整个程序仍然很慢。 任何建议表示赞赏。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM