У меня есть вопрос, связанный с низкой производительностью выделения памяти для нескольких структур.
У меня есть структура, которая выглядит следующим образом: см. Ниже
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();
и инициирование элементов после него.
К сожалению это довольно медленно, Поэтому у кого-нибудь из вас есть идея улучшить производительность?
Во-первых, вы захотите исправить это так, чтобы он действительно был написан на 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). Существуют и другие схемы, такие как арена памяти, которая может быть еще быстрее, в зависимости от ваших потребностей в освобождении.
Если вы знаете, сколько у вас будет узлов, вы можете выделить их все за один раз:
node* Nodes = new node[1000000];
Затем вам нужно будет установить значения, как если бы вы делали это одно за другим. Если это намного быстрее, вы можете попробовать архитектуру, в которой вы узнаете, сколько узлов вам понадобится, прежде чем выделять их, даже если у вас нет этого числа прямо сейчас.