【问题标题】:Optimize vector emplace_back优化向量emplace_back
【发布时间】:2021-04-01 04:07:18
【问题描述】:

我们必须找到一个圆中的所有点并将其保存在一个向量中以进行平面拟合。我们为此编写了以下代码。圆圈中的点数约为 2960520。执行时,执行vec.emplace_back(t) 大约需要 300 毫秒。有没有办法优化代码?

constexpr int radius = 971;
auto time_begin = chrono::high_resolution_clock::now();
int rSquare = radius * radius;
vector<Point_t> vec;
vec.reserve(2048 * 2048);
for (int i = 1024 - radius; i < 1024 + radius; ++i)
{
    int iSquare = (i - 1024) * (i - 1024);
    for (int j = 1024 - radius; j < 1024 + radius; ++j)
    {
        int y = j - 1024;
        if ((y * y + iSquare) <= rSquare)
        {
            Point_t t{ static_cast<double>(i),static_cast<double>(j) };
            vec.emplace_back(t);
        }
    }
}

auto time_end = chrono::high_resolution_clock::now();

结构声明

struct Point_t
{
    double dX;
    double dY;
};

【问题讨论】:

  • 尽量避免创建一个临时的Point_t 对象。 IE。 vec.emplace_back(static_cast&lt;double&gt;(i), static_cast&lt;double&gt;(j)); 这就是为什么emplace_back() 函数的作用。
  • @TedLyngmo 是的,你是对的,我只是错过了reserve 行。
  • @Sprite 即使没有reserve,我敢打赌在这种情况下vectorlist 更快。它不会像 list 那样做 2960520 次动态分配。
  • @TedLyngmo 我明白了,谢谢。
  • emplace_back 是唯一可观察到的效果,没有它,编译器可能会完全优化循环。

标签: c++ optimization stl c++17


【解决方案1】:

我建议您重新考虑算法。您当前测试该区域中的所有点。相反,您可以只使用毕达哥拉斯定理来计算每条线的起点和终点。如果你做对了,你实际上只需要计算圆的四分之一。

虽然这需要使用平方根,但我认为执行 sqrt 'radius' 次数很可能比测试 (2*radius)^2 点快得多。

抱歉,没有代码。目前无法访问 C++ 编译器。

【讨论】:

猜你喜欢
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 2012-10-15
  • 2021-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多