1

我确实有一个与为多个结构分配内存的性能缓慢有关的问题。我有一个看起来像这样的结构:见下文

typedef struct _node
{
 // Pointer to leaves & neigbours
 struct _node *children[nrChild], *neighb[nrNeigh];
 // Pointer to parent Node
 struct _node *parentNode;  
 struct _edgeCorner *edgePointID[nrOfEdge];

 int    indexID;                // Value
 double f[latDir];              // Lattice Velos
 double rho;                    // Density
 double  Umag;                  // Mag. velocity    
 int    depth;                  // Depth of octree element

} node

在我的代码开始时,我确实必须使用以下方法创建很多(100.000 – 1.000.000):

tree = new node();

并在它之后启动元素。不幸的是,这很慢,因此你们中的任何人都有提高性能的想法吗?

4

2 回答 2

3

首先,您需要修复它,以便它实际上是用 C++ 编写的。

struct node
{
    // Pointer to leaves & neigbours
    std::array<std::unique_ptr<node>, nrChild> children;
    std::array<node*, nrNeigh> neighb;
    // Pointer to parent Node
    node* parentNode;  
    std::array<_edgeCorner*, nrOfEdge> edgePointID;

    int    indexID;                // Value
    std::array<double, latDir> f;  // Lattice Velos
    double rho;                    // Density
    double  Umag;                  // Mag. velocity    
    int    depth;                  // Depth of octree element
};

其次,为了提高性能,您将需要一个自定义分配器。Boost.Pool 将是一个不错的选择——它是一个预先存在的解决方案,专门为相同大小的重复分配而设计,在本例中为 sizeof(node)。根据您的释放需求,还有其他方案(例如 memory arena)可以更快。

于 2013-03-11T12:10:08.837 回答
1

如果你知道你将拥有多少个节点,你可以一次性分配它们:

node* Nodes = new node[1000000];

之后您将需要设置这些值,就像您一一设置一样。如果这种方式快得多,您可以尝试一种架构,在该架构中您可以在分配节点之前找出您需要多少节点,即使您现在没有这个数字。

于 2013-03-11T12:13:54.780 回答