簡體   English   中英

C ++:優化列表

[英]C++: Optimized list

我的代碼的一些密集分析表明,它花費了大量時間為向量分配空間。
對於大多數這些向量,大小是事先已知的,所以我調用reserve()來預先分配空間。
對於大多數這些向量,大小幾乎總是非常小 - 像4或5個元素,但在極少數情況下它可能非常大。
我想到的另一個優化是創建我自己的容器OptimizedList<T,N> 此對象的實例本身包含N個T實例作為普通數組,如果用戶嘗試添加多於N個項,則它開始使用動態分配額外項。

有沒有已知的實現?

Qt 基於堆棧的可變長度數組怎么樣?

看起來像是你的用例的完美匹配,主要是小數組,它將被分配在堆棧上(最快的分配,只是一對指針上的一對add / sub指令),用於小型數組,在堆上用於大型數組。

但它確實浪費了空間。

我會考慮使用std::vector和一個針對4-5個元素優化的自定義分配器(從池中提取這些元素)作為最簡單和最可行的解決方案。 這也是我期望實際提供凈收益的唯一解決方案。

使用std::deque可能沒有幫助,盡管從教科書的角度來看它似乎是這樣。 它實際上可能會受傷。 Deques減少了將數據從O(n)復制到O(1)的開銷,但它們並沒有神奇的分配。 相反,它們可能比使用矢量會產生更多的分配。
Deques通常作為矢量矢量或循環緩沖器實現。 在后一種情況下,您具有與使用std::vector完全相同的重新分配開銷, 除非您無法通過調用reserve()來緩解它 ,而在前一種情況下,您有兩個分配,否則您只有一個。

將前幾個對象直接嵌入到自定義向​​量類中或嵌入到堆棧中的vararray中,就像在Bgie的回答中一樣,這非常誘人,對於沒有太多不太大的向量,這確實是一個很好的解決方案。
但是,由於您在創建這些向量時遇到了性能問題,因此可以得出結論,您不是僅使用5或10個向量,而是使用其中的許多向量(否則它不會真正重要,它將無法測量!)。 這意味着將數據放在堆棧上可能會導致最終的堆棧溢出。
但是,如果所有向量都是堆分配的,那么這可能是一個很好的解決方案。 在分配容器本身時是否多分配幾百個字節沒有什么區別,並且沒有風險溢出堆棧。 所以在這種情況下,你可以有效地保存一個分配。

因為你的大多數容器很小而稀有容器有很多元素,所以我更喜歡std::deque 這可以幫助您避免以低價格進行不必要的重新分配。 它沒有reserve()方法,但由於大多數容器都很小,我認為沒問題。

更重要的是 ,您應該檢查包含在這些容器中的對象類型。 我認為瓶頸不是重新分配,而是復制/破壞它的一部分。 我懷疑“容器的值”復制構造函數和/或析構函數“足夠”。 復制N個元素然后在構造函數/析構函數過於復雜時銷毀舊的N元素非常耗時。

作為上次優化,我建議使用內存池/分配器來減少底層的malloc / realloc / free調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM