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

並啓動後面的元素。 不幸的是,這是很慢,因此,你們有沒有想過改善性能?

回答

3

首先,您需要修復它,以便它實際上用C++編寫。其次,爲了提高你的性能,你需要一個自定義的分配器。 Boost.Pool將是一個很好的選擇 - 它是一個預先存在的解決方案,明確地設計用於重複分配相同的大小,在這種情況下,sizeof(節點)。還有其他一些方案,如內存競技場,甚至可以更快,取決於您的取消分配需求。

+0

當然,這很可能不會與他的編譯器一起工作,並且如果它有更好的機會,它將不具有正確的語義。 (使用'unique_ptr'可能不是正確的解決方案。) – 2013-03-11 12:26:53

+0

它被標記爲VS2010,因此它有很好的機會與編譯器一起工作,並獲得預期的結果。 – Puppy 2013-03-11 12:35:19

+0

好傢伙, 因爲我感興趣的是使用Boost.Pool庫看到的性能差異,我試圖做同樣的

'樹=新節點();'

與升壓池庫,像「DeadMG」使用

'的boost :: fast_pool_allocator繞着彎

現在的問題是我不知道的語法通過使用boost :: fast_pool_allocator做同樣的。 任何人都可以幫助我嗎? – Sambo 2013-03-22 11:24:28

1

如果你知道你將多少個節點,你可以將它們分配都一氣呵成:

node* Nodes = new node[1000000]; 

您需要以後設置的值,就像如果您做了一個你會怎麼做一。如果通過這種方式快得多,您可以嘗試一種體系結構,在分配這些節點之前找出需要多少節點,即使您現在還沒有這個數字。

+1

這個問題的主要問題是他不能一次性釋放它們。 – Puppy 2013-03-11 12:24:35

+0

我會爲他的節點創建一個塊分配器是相當平凡的。 – 2013-03-11 12:27:47

+0

只要我能夠添加一些額外的元素,這是一種可能的方法。我只有一個問題:如何訪問第一個,第二個等元素來啓動它們? – Sambo 2013-03-11 13:19:07