繁体   English   中英

C ++加速地图访问

[英]C++ speed up map access

我定义了以下地图:

class xy_angle {
public:
    int x;
    int y;
    int angle;

    xy_angle(int x, int y, int angle) :x(x), y(y), angle(angle){};

};

class xy_angleComparator {
public:
    bool operator () (const xy_angle &a, const xy_angle &b) const {
        if (a.x != b.x)
            return a.x < b.x;
        else if (a.y != b.y)
            return a.y < b.y;
        else if (a.angle != b.angle)
            return a.angle < b.angle;
        else
            return false;
    }
};

std::map<xy_angle, std::pair<int, int>, xy_angleComparator> transformed_coordinates_lut_;

我在初始化包含它的类时将其填满:

//creating LUTs
int half_patch_size=48;
for (int x_start = -half_patch_size; x_start <= half_patch_size; x_start++){
    for (int y_start = -half_patch_size; y_start <= half_patch_size; y_start++){
        for (int angle = -314; angle < 314; angle++){
            float angle_f = (float)angle / 100.f;
            double cos_theta = cos(angle_f);
            double sin_theta = sin(angle_f);

            int x_tranformed = (int)(((float)x_start)*cos_theta - ((float)y_start)*sin_theta);
            int y_tranformed = (int)(((float)x_start)*sin_theta + ((float)y_start)*cos_theta);

            if (x_tranformed > half_patch_size)
                x_tranformed = half_patch_size;

            if (x_tranformed < -half_patch_size)
                x_tranformed = -half_patch_size;

            if (y_tranformed > half_patch_size)
                y_tranformed = half_patch_size;

            if (y_tranformed < -half_patch_size)
                y_tranformed = -half_patch_size;

            transformed_coordinates_lut_[xy_angle(x_start, y_start, angle)] = std::pair<int, int>(x_tranformed, y_tranformed);
        }
    }
}

我使用以下代码访问它:

int ax2 = transformed_coordinates_lut_[xy_angle(ax, ay, theta)].first;
int ay2 = transformed_coordinates_lut_[xy_angle(ax, ay, theta)].second;

我使用大量随机键来测量地图的访问运行时间,这非常疯狂。 它完全支配使用它的功能的运行时间。

有什么办法可以加快速度吗?

谢谢!

吉尔。

您可以改用3-D数组: f[x_start][y_start][angle] 因为您仍然拥有所有可能的键,所以它将占用相同(或更少)的空间。 当然,您也可以使用适当的索引来模拟具有平面向量的3-D数组。 这种方法可确保您不断进行时间查找。

无论使用哪个容器,此代码都是不好的:

int ax2 = transformed_coordinates_lut_[xy_angle(ax, ay, theta)].first;
int ay2 = transformed_coordinates_lut_[xy_angle(ax, ay, theta)].second;

您要进行两次相同的查询! 绝对缓存结果:

auto& a2 = transformed_coordinates_lut_[xy_angle(ax, ay, theta)];
int ax2 = a2.first;
int ay2 = a2.second;

现在,就加快工作进度而言。 至少需要做的最简单的工作就是分解出一个不同的关联容器类型:

using MapType = std::unordered_map<xy_angle,
                                   std::pair<int, int>,
                                   xy_angle_hash>; // implement this hash

这将为您提供O(1)查找,而不是您当前在代码中使用std::map看到的O(lg N) 但是,如果您真的想花很多时间探索这个容器,建议您包装一下它,以便您控制实现:

class TransformMap
{
public:
    std::pair<int, int>& operator()(const xy_angle& );

private:
    // is it std::map?
    // or std::unordered_map?
    // or 3D-array or vector or ... ?
};

暂无
暂无

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

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