2013-06-25 43 views
5

我有以下幾點:什麼是boost ::可選效率?

class Obj; 
typedef std::map<string, string> StrMap; 
std::map<std::string, std::pair<Obj, StrMap> > complexMap; 

的事情是,在complexMap一些條目StrMap將是空的,我不會用它在所有的,所以爲了提高效率,我在考慮使用boost ::可選的。我的問題是boost :: optional的效率是多少,恐怕通過支付它的價格,最終我什麼也得不到。

+4

您是否已經對您的代碼進行了分析並確定存在性能瓶頸空地圖? –

+1

@LucTouraille,不,我只是希望獲得我能達到的最高性能。 – Subway

+1

你在考慮什麼替代方案?找到「最高性能」的方法是分析不同的解決方案並挑選出性能最高的解決方案。 – juanchopanza

回答

5

想象的那樣,可容納0或1的值的容器。你的地圖已經是一個可容納0到N個元素的容器。因此,可選映射是一個容器可容納0到N個元素的容器。真的,這裏沒有任何好處。

空映射的開銷很小。地圖實際上是由內部的地圖節點構建而成的,空的地圖沒有任何節點。(它不能,因爲每個節點都有一個值,並且沒有辦法通過空的地圖創建一個默認值)

+0

簡單明瞭。謝謝! – Subway

2

如果你正在做一個「疏」的計算,你可以做兩件事情:

  1. 保持較大的complexMap包含了很多用boost::optional不存在的結果。這基於每個元素將稀疏度封裝在上。
  2. 創建一個額外的間接層(unordered_map),其中包含指向complexmMap中現有元素的指針。這將稀疏性封裝在每個地圖的基礎上的

作爲一名程序員,方案1對你來說更加方便,只需要很少的空間開銷。方案2將幾乎完美地節省空間,並儘可能小,但需要更多編程工作。 (提示:如果你正在做的千兆字節級計算,也許額外的間接水平回報,否則我不會打擾)。

除了空間開銷之外,boost::optional幾乎沒有其他開銷,因爲它不需要默認構造函數或動態內存分配。

2

移動到一個答案評論...

想想如何選購實施,它通常有一些內部存儲(它允許對按住地圖對象 - 當您在您的代碼將以上) ,唯一的區別是它不會在該存儲中構建地圖 - 這留待以後使用。然而,必須構建可選對象。因此,現在不是隻構造一個地圖,而是在不使用地圖的情況下構建一個更大的可選對象,而當您使用地圖時,也必須構建該地圖。看起來像你正在做更多的事情沒有多大好處。

在某些情況下,optional確實有意義(例如,返回值,例如,您想要指示無效狀態,或者您有一個非常昂貴的構造函數,它會執行大量複雜構件的初始化)構造函數,可選的確不值得代碼混亂。

免責聲明:但是,和所有的性能相關的問題,型材,異型材,然後再檔...的optional

相關問題