[英]Optimize vector emplace_back
我們必須找到一個圓中的所有點並將其保存在一個向量中以進行平面擬合。 我們為此編寫了以下代碼。 圓圈中的點數約為 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;
};
我建議你重新考慮算法。 您當前測試該區域中的所有點。 相反,您可以只使用畢達哥拉斯定理來計算每條線的起點和終點。 如果你做對了,你實際上只需要計算四分之一的圓。
雖然這需要使用平方根,但我認為執行 sqrt 'radius' 次數很可能比測試(2*radius)^2
點快得多。
對不起,沒有代碼。 目前無權訪問 C++ 編譯器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.