C++ 加速 map 访问

标签 c++ performance

我定义了以下 map :

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;

我使用大量随 secret 钥测量了 map 的访问运行时间,这非常疯狂。它完全控制了使用它的函数的运行时间。

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

谢谢!

吉尔.

最佳答案

您可以改用 3-D 数组:f[x_start][y_start][angle]。它会占用相同(或更少)的空间,因为无论如何你都有所有可能的键。当然,您还可以使用适当的索引来模拟具有平面 vector 的 3-D 数组。这种方法可以保证您的查找时间恒定。

关于C++ 加速 map 访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27841005/

相关文章:

java - BigDecimal 构造函数性能 - 字符串与数字

python - 如何从每个键的数据帧字典中获取平均值和标准差

c++ - 在 XCode 中包装 C++ 库

c++ - char&* 是什么意思?

c++ - 使用最大日期时的 COleDateTime 行为

c++ - Http POST,使用Qt选择页面

c++ - C++中的构造函数调用歧义

python - 零填充数据,直到其长度等于 2 的幂

php - 我应该将每个用户的头像存储在服务器上吗?

perl - 如何有效地计算覆盖 Perl 给定范围的范围?