簡體   English   中英

哪個是查找最快的STL容器?

[英]Which is the fastest STL container for find?

好的作為前言我需要緩存很少修改數據的相對較小的子集,以避免出於性能原因頻繁查詢數據庫。 這些數據大量用於只讀意義,因為它通常由其他表中的更大數據集引用。

我編寫了一個類,它能夠在內存中基本上存儲所討論的兩個表的全部內容,同時監聽提交更改以及用於更新緩存對象的線程安全回調機制。

我當前的實現有兩個std::vectors ,每個表的元素一個。 該類提供對每個向量的全部訪問以及通過std::findstd::find_if等搜索表數據的特定元素的便捷方法。

有沒有人知道在std::vector使用std::liststd::setstd::map進行搜索會更好嗎? 大多數情況下,在建立新連接后從數據庫填充一次后將要求這些容器。

我也願意使用VS2010或Boost支持的C ++ 0x功能。

對於搜索特定值,使用std::setstd::map需要O(log N)時間,而另外兩個需要O(N)時間; 所以, std::setstd::map可能更好。 由於您可以訪問C ++ 0x,因此您還可以使用std::unordered_setstd::unordered_map ,它們平均需要一段時間。

對於find_if ,它們之間沒有什么區別,因為它需要一個任意謂詞,當然容器也不能隨意優化。

但是,如果你經常使用某個謂詞調用find_if ,你可以自己優化:使用std::mapstd::set和自定義比較器或特殊鍵,然后使用find

如果你不經常更新,使用std::lower_bound有序向量可以和std::set一樣快; 他們都是O(log n)。 值得嘗試看看哪種情況更適合您自己的情況。

由於你的(擴展)需求需要搜索多個字段,我會指向Boost.MultiIndex。

這個Boost庫允許你構建一個容器(它只包含它包含的每個元素的一個示例)並將其索引到任意數量的索引上。 它還可以讓您精確地使用哪些索引。

要確定要使用的索引類型,您需要廣泛的基准測試。 500是一個相對較少的條目,因此不變的因素將無法很好地發揮作用。 此外,單線程和多線程使用之間可能存在明顯的差異(大多數哈希表實現可能會因MT使用而崩潰,因為它們不使用線性重組,因此單個線程最終會重新對表進行重新整理,阻塞所有其他)。

如果性能差異不明顯或根本無關緊要,我會推薦一個排序索引(跳過列表,如果可能的話)來容納范圍請求(所有名稱以Abc開頭?)。

測試一下。 這很簡單,容器在STL中幾乎可以互換。

如果您只想搜索表中的一個特定列的不同值,那么std::hash是最快的。

如果您希望能夠使用多個不同的謂詞進行搜索,則需要某種索引結構。 它可以通過擴展當前基於向量的方法和多個哈希表或映射來實現,每個字段用於搜索,其中值是向量的索引,或者是向量中元素的直接指針。

更進一步,如果您希望能夠搜索范圍,例如7月份的所有日期,您需要一個有序的數據結構,您可以在其中提取范圍。

不是stl,但是商業c ++容器是abax容器,其在插入中具有搜索,刪除,修改,O(logn)中的O(1)。

本身不是答案,但請務必使用typedef來引用您使用的容器類型,例如typedef std::vector< itemtype > data_table_cache; 然后到處使用你的typedef類型。

暫無
暫無

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

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