我比较了 boost::geometry::distance
的性能上model::d2::point_xy<float>
具有等效简单 2D 实现的参数:
struct Point {
float x, y;
float distance(const Point& p) const {return sqrt((x-p.x)*(x-p.x)+(y-p.y)*(y-p.y));}
};
(请参阅 http://rextester.com/NTOVR83857 处的整个基准)。我发现 boost 版本在所有主要 C++ 编译器中始终较慢:
- gcc 为 1.77 倍
- clang 为 1.47 倍
- 对于 vc++ 为 1.51 倍
我尝试了与 double
相同的基准测试点坐标,boost 在其中执行而无需开销。我注意到boost::geometry::distance
与 model::d2::point_xy<float>
参数返回 double
,这似乎是减速的原因。为什么它不返回 float
?
最佳答案
由于boost使用模板,因此需要确保返回类型具有足够的精度。想象一下,如果输入点的 X 和 Y 具有整数值 - 结果需要的不仅仅是整数精度。此外,如果输入 Point 对 X 和 Y 使用 double 值,则 float
的结果将不够精确。因此,看来选择 double
作为足够的精度。
此处给出距离模板设计的基本原理:
http://www.boost.org/doc/libs/1_58_0/libs/geometry/doc/html/geometry/design.html
关于c++ - 为什么 boost::geometry::distance 与 model::d2::point_xy<float> 返回 double 而不是 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29983385/