我有个问题boost :: geometry :: intersection性能调试配置。我的项目的一部分有很多(百万)多边形 - 多边形类型的交点。与发布相比,它的调试速度非常慢。所以我需要等很多时间来调试这个“交集”部分之后的问题。我能做些什么来加速它在调试模式?简单的Win32控制台项目的在VS2010Boost :: geometry ::在调试模式下的交集性能
代码例如:
#include "stdafx.h"
#include <time.h>
#include <deque>
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/foreach.hpp>
bool get_poly_intersection_area_S_2d( const double *poly_x_1, const int poly_n_1, const double *poly_x_2, const int poly_n_2, double *S)
{
// intersects two 2d polygons using boost::geometry library
// polygons are in 3d format [(x0, y0, 0.0) (x1, y1, 0.0) .... (xn, yn, 0.0) ]
// S is resulting area of intersection
// returns true if intersection exists (area > DBL_EPSILON) and false otherwise
typedef boost::geometry::model::d2::point_xy<double> bg_point;
typedef boost::geometry::model::polygon< bg_point, false, false > bg_polygon;
*S = 0.0;
bg_polygon bg_poly_1, bg_poly_2;
// init boost 2d polygons by our double 3D polygons
for(int i=0; i<poly_n_1; i++)
bg_poly_1.outer().push_back(bg_point(poly_x_1[i*3], poly_x_1[i*3+1]));
for(int i=0; i<poly_n_2; i++)
bg_poly_2.outer().push_back(bg_point(poly_x_2[i*3], poly_x_2[i*3+1]));
// correct polygons
boost::geometry::correct(bg_poly_1);
boost::geometry::correct(bg_poly_2);
// call intersection
std::deque<bg_polygon> output;
bool res = boost::geometry::intersection(bg_poly_1, bg_poly_2, output);
if(!res)
return false;
// for each polygon of intersection we add area
BOOST_FOREACH(bg_polygon const& p, output)
{
double s = boost::geometry::area(p);
*S += s;
}
// no intersection
if(fabs(*S) <= DBL_EPSILON)
return false;
// intersection > DBL_EPSILON
return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
double p1[4 * 3] = {0,0,0, 2,0,0, 2,2,0, 0,2,0};
double p2[4 * 3] = {1,1,0, 3,1,0, 3,3,0, 1,3,0};
clock_t start_t, finish_t;
start_t = clock();
for(int i=0;i<5000; i++)
{
double s;
for(int k=0; k<4; k++)
{
p1[k*4] += i;
p2[k*4] += i;
}
get_poly_intersection_area_S_2d(p1, 4, p2, 4, &s);
}
finish_t = clock();
printf("time=%.3f s\n", double(finish_t - start_t)/1000.);
return 0;
}
在调试它需要15秒,在Release0.1秒。而这里只有5000个多边形交叉点。对于数百万人来说,它会慢得多。
非常感谢,Barend!设置_HAS_ITERATOR_DEBUGGING = 0和_NO_DEBUG_HEAP = 1在10次以上加速示例。所以现在,不是15秒,而是1.5秒。但是另一个问题发生。使用_HAS_ITERATOR_DEBUGGING = 0链接不同的库并且没有导致链接错误LNK2038:为'_ITERATOR_DEBUG_LEVEL'检测到不匹配:值'2'与值'0'不匹配。 – alxand
好,它有帮助。我没有这方面的经验,但链接也提到了这一点,并提供了一个可能的解决方案:如果你有这些其他库的来源,你可以使用相同的定义来编译它们。 –