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)) の割り当てを繰り返すために明示的に設計された既存のソリューションです。解放の必要性に応じて、メモリ アリーナのような他のスキームがあり、さらに高速になります。

于 2013-03-11T12:10:08.837 に答える
1

所有するノードの数がわかっている場合は、それらすべてを一度に割り当てることができます。

node* Nodes = new node[1000000];

1 つずつ行った場合と同様に、後で値を設定する必要があります。この方法の方がはるかに高速である場合は、現在その数がなくても、割り当てる前に必要なノードの数を確認できるアーキテクチャを試すことができます。

于 2013-03-11T12:13:54.780 に答える