【发布时间】: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<double>(i), static_cast<double>(j));这就是为什么emplace_back()函数的作用。 -
@TedLyngmo 是的,你是对的,我只是错过了
reserve行。 -
@Sprite 即使没有
reserve,我敢打赌在这种情况下vector比list更快。它不会像list那样做 2960520 次动态分配。 -
@TedLyngmo 我明白了,谢谢。
-
emplace_back是唯一可观察到的效果,没有它,编译器可能会完全优化循环。
标签: c++ optimization stl c++17