2013-08-01 39 views
3

我制作了一个八叉树,可以快速匹配三维点。它速度很快!但是,删除八叉树比构建它要花费的时间多100倍。我不明白为什么会发生这种情况。这是我的课程:为什么递归内存释放很慢?

#pragma once 
#include "LeakCheck.h" 
#include "vec3.h" 

namespace Geometry 
{ 

static const float tolerance = 1.0e-30f; 

class VertexOctree 
{ 
private: 
    float halfSize; 
    vec3 center; 
    VertexOctree *subTrees; 
    int vertexIndex; 
    void CreateSubTree() 
    { 
     subTrees = news VertexOctree[8]; 
     subTrees[0] = VertexOctree(center+(vec3(-1.0f,-1.0f,-1.0f)*halfSize),halfSize*0.5f); 
     subTrees[1] = VertexOctree(center+(vec3(+1.0f,-1.0f,-1.0f)*halfSize),halfSize*0.5f); 
     subTrees[2] = VertexOctree(center+(vec3(-1.0f,+1.0f,-1.0f)*halfSize),halfSize*0.5f); 
     subTrees[3] = VertexOctree(center+(vec3(+1.0f,+1.0f,-1.0f)*halfSize),halfSize*0.5f); 
     subTrees[4] = VertexOctree(center+(vec3(-1.0f,-1.0f,+1.0f)*halfSize),halfSize*0.5f); 
     subTrees[5] = VertexOctree(center+(vec3(+1.0f,-1.0f,+1.0f)*halfSize),halfSize*0.5f); 
     subTrees[6] = VertexOctree(center+(vec3(-1.0f,+1.0f,+1.0f)*halfSize),halfSize*0.5f); 
     subTrees[7] = VertexOctree(center+(vec3(+1.0f,+1.0f,+1.0f)*halfSize),halfSize*0.5f); 
    } 
public: 
    int AddVertex(std::vector<vec3> &VertexList, const vec3& Point) 
    { 
     if (vertexIndex == -1) { 
      vertexIndex = VertexList.size(); 
      VertexList.push_back(Point); 
      return vertexIndex; 
     } 
     if ((VertexList[vertexIndex]-Point).lengthSq() < tolerance) { 
      return vertexIndex; 
     } 
     if (subTrees == NULL) 
      CreateSubTree(); 

     return subTrees[(Point.x>center.x)+(2*(Point.y>center.y))+(4*(Point.z>center.z))].AddVertex(VertexList, Point); 
    } 
    VertexOctree() 
    { 
     subTrees = NULL; 
     vertexIndex = -1; 
    } 
    VertexOctree(vec3 Center, float HalfSize) 
    { 
     subTrees = NULL; 
     center = Center; 
     halfSize = HalfSize; 
     vertexIndex = -1; 
    } 
    ~VertexOctree() 
    { 
     if (subTrees) 
      delete[] subTrees; 
    } 
}; 

}; 

删除VertexOctree时,需要很长的时间。比创建树还要做浮点运算来比较点并分配内存要长得多。为什么删除它很慢?我使用Visual Studio 2012并在发布模式下编译。

+1

这是在发布还是调试版本?调试版本会很慢,因为它在释放之前将所有取消分配的内存填充以重用(检测是否重新使用它)。 –

+0

Visual Studio 2012并在发布模式下编译。我的意思是发布版本。 – bofjas

+1

你不需要测试'subTrees.''delete'操作符已经做到了。做两次没有好处。 – EJP

回答

4

当您按F5运行程序时,即使在发布模式下,它也会使用特殊的较慢调试堆。如果按Ctrl + F5,即使在调试模式下,它也会使用常规堆。尝试一下,如果它加快速度,那么在项目的调试属性中,在环境框中将_NO_DEBUG_HEAP = 1设置为始终使用快堆。

+0

这样做!非常感谢。我不知道那件事。这对调试有什么影响?无论如何,我认为不可能在发布版本中进行任何调试。 – bofjas

+0

不客气!我认为调试堆做了额外的检查,你没有覆盖缓冲区或写入已删除的内存。 –

+0

您可以在调试时运行发布模式,但由于优化原因代码可能已更改,所以更难。 –