C++ 优化向量布设
我们必须找到一个圆中的所有点,并将其保持在一个向量中,以便进行平面拟合。我们已经为此编写了以下代码。圆圈中的点数约为2960520。执行时,执行C++ 优化向量布设,c++,optimization,stl,c++17,C++,Optimization,Stl,C++17,我们必须找到一个圆中的所有点,并将其保持在一个向量中,以便进行平面拟合。我们已经为此编写了以下代码。圆圈中的点数约为2960520。执行时,执行vec.emplace\u back(t)大约需要300毫秒。有没有办法优化代码 constexpr int radius = 971; auto time_begin = chrono::high_resolution_clock::now(); int rSquare = radius * radius; vector<Point_t>
vec.emplace\u 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();
我建议你重新考虑一下算法。您当前正在测试该区域中的所有点。相反,您可以使用毕达哥拉斯定理来计算每条直线的起点和终点。如果你做得正确,你实际上只需要计算圆的四分之一 虽然这需要使用平方根,但我认为执行sqrt“radius”的次数可能比测试
(2*radius)^2
点快得多
对不起,没有密码。暂时没有访问C++编译器。尽量避免创建临时<代码> PooToTyt< /Cord>对象。即
vec.emplace_-back(静态施法(I)、静态施法(j))
这就是为什么emplace_back()
函数是用于的。@TedLyngmo是的,你是对的,我刚刚错过了保留
行。@Sprite即使没有保留
我打赌在这种情况下向量
比列表
快。它不会像列表
那样进行2960520次动态分配。@TedLyngmo我明白了,谢谢。emplace\u back
是唯一可以观察到的效果,没有它编译器可能会完全优化循环。通过完全避免昂贵的数学操作,甚至可以使它更快:。还有,关于这一点,我先用了bresenhans algo。有几个重复点。移除它们代价高昂
struct Point_t
{
double dX;
double dY;
};