C++加速地图访问
我定义了以下地图:C++加速地图访问,c++,performance,C++,Performance,我定义了以下地图: 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) co
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_;
我用一大组随机键测量了地图的访问运行时间,这太疯狂了。它完全控制着使用它的函数的运行时间
有没有办法加快速度
谢谢
吉尔 您可以使用三维阵列:f[x_start][y_start][angle]。它将占用相同或更少的空间,因为您无论如何都有所有可能的密钥。当然,您也可以使用适当的索引模拟具有平面向量的三维阵列。这种方法保证了查找时间的恒定。无论使用哪个容器,此代码都是错误的:
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
Map的速度很慢,因为AFAIK经常将其实现为二叉树。无序的地图应该更快。如果你真的需要速度,你可以考虑一个排序向量。IIRC几个STL容器的效率有所提高。您可以尝试使用std::Unorered_映射来获得更好的搜索性能。您是说ax2和ay2的分配需要很长时间,还是创建LUT?此外,可以通过同时指定x_transformed和y_transformed来简化if语句。此外,如果不考虑设计中的顺序,无序映射的访问速度更快。并且确保在测量性能时不使用调试构建。即使是std::vector的操作符[]也会显得非常慢。谢谢你的帮助!
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
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 ... ?
};