Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance 调试模式下的Boost::geometry::交叉点性能_Performance_Boost Geometry - Fatal编程技术网

Performance 调试模式下的Boost::geometry::交叉点性能

Performance 调试模式下的Boost::geometry::交叉点性能,performance,boost-geometry,Performance,Boost Geometry,我有一个关于boost::geometry::intersection在Debug配置中的性能的问题。我项目的一部分有很多(数百万)多边形类型的交点。与发布版相比,它的调试速度非常慢。因此,在这个“交叉”部分之后,我需要等待很多时间来调试问题。在调试模式下,我可以做些什么来加速它 VS2010中简单Win32控制台项目的代码示例: #include "stdafx.h" #include <time.h> #include <deque> #include <boo

我有一个关于boost::geometry::intersectionDebug配置中的性能的问题。我项目的一部分有很多(数百万)多边形类型的交点。与发布版相比,它的调试速度非常慢。因此,在这个“交叉”部分之后,我需要等待很多时间来调试问题。在调试模式下,我可以做些什么来加速它

VS2010中简单Win32控制台项目的代码示例:

#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;
}
#包括“stdafx.h”
#包括
#包括
#包括
#包括
#包括
#包括
bool get_poly_intersection_area_S_2d(常数双*多边形x_1,常数整数多边形n_1,常数双*多边形x_2,常数整数多边形n_2,双*S)
{
//使用boost::geometry library相交两个二维多边形
//多边形采用3d格式[(x0,y0,0.0)(x1,y1,0.0)…(xn,yn,0.0)]
//S是相交的结果面积
//如果存在交点(面积>DBL_ε),则返回true,否则返回false
typedef boost::geometry::model::d2::point_xy bg_point;
typedef boost::geometry::model::polygonbg_polygon;
*S=0.0;
多边形1,多边形2;
//init通过我们的双3D多边形提升2d多边形

对于(int i=0;i而言,最好的方法是找到一种方法,用一个小数据集重现您正在调试的问题。这在许多方面都有帮助,尤其是在您解决了问题后创建回归测试时

你写:“调试问题在这个‘交叉点’部分之后”


这向我建议,您可以选择保存交叉点部分的输出,以便只需运行一次,然后可以选择加载保存的部分结果,并在调试模式下从那里运行程序的其余部分。

提升。几何体速度严重受stl(矢量、德克、地图)速度的影响这在调试模式下相当慢

您可以尝试解决此问题,例如,通过以下链接:

特别是第二个链接建议将_HAS_ITERATOR_debuging设置为0,这可能会有很大帮助,因为在Boost.Geometry中大量使用迭代器


或者,您可以尝试使用stl端口。

非常感谢,Barend!设置\u HAS\u ITERATOR\u DEBUG=0和\u NO\u DEBUG\u HEAP=1将上述示例的速度提高10倍。因此,现在不是15秒,而是1.5秒。但是出现了另一个问题。使用\u HAS\u ITERATOR\u DEBUG=0链接不同的库,并且不会导致链接错误LNK2038:检测到不匹配对于“_ITERATOR_DEBUG_LEVEL”:值“2”与值“0”不匹配。这很好。我没有这方面的经验,但该链接也提到了这一点,可能还有一个解决方案:如果您有这些其他库的源代码,您可以使用相同的定义编译它们。嗨,RavenPoint!我还考虑过在release mod中保存交集结果e,然后在调试中加载。这不是很方便,但如果我找不到其他可接受的方法解决这个问题,我会这样做。谢谢!