Распределение памяти для структуры (низкая производительность)

У меня есть вопрос, связанный с низкой производительностью выделения памяти для нескольких структур.
У меня есть структура, которая выглядит следующим образом: см. Ниже

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();

и инициирование элементов после него.
К сожалению это довольно медленно, Поэтому у кого-нибудь из вас есть идея улучшить производительность?

1

Решение

Во-первых, вы захотите исправить это так, чтобы он действительно был написан на 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). Существуют и другие схемы, такие как арена памяти, которая может быть еще быстрее, в зависимости от ваших потребностей в освобождении.

3

Другие решения

Если вы знаете, сколько у вас будет узлов, вы можете выделить их все за один раз:

node* Nodes = new node[1000000];

Затем вам нужно будет установить значения, как если бы вы делали это одно за другим. Если это намного быстрее, вы можете попробовать архитектуру, в которой вы узнаете, сколько узлов вам понадобится, прежде чем выделять их, даже если у вас нет этого числа прямо сейчас.

1

По вопросам рекламы [email protected]