C++拾取——Linux下实测布隆过滤器(Bloom filter)和unordered_multiset查询效率
? ? ? ? 布隆過濾器是一種判定元素是否存在于集合中的方法。其基本原理是使用哈希方法將數據映射到一個很長的向量上。在維基百科上,它被稱為“空間效率和查詢時間都遠遠超過一般的算法”的方法。由于它只保存散列的數據,所以對于很長的數據有著良好的壓縮特性,這個是個不爭的事實(可以參見《布隆過濾器 (Bloom Filter) 詳解》)。但是其查詢效率究竟如何,我們還是要實際測試一下。(轉載請指明出于breaksoftware的csdn博客)
? ? ? ? 我們選用unordered_multiset作為對比對象,是因為在《C++拾趣——STL容器的插入、刪除、遍歷和查找操作性能對比(ubuntu g++)——遍歷和查找》中,實驗驗證它的查詢效率是最高的。
? ? ? ? 由于布隆過濾器存在以下特性:
- 判定不存在的一定不存在
- 判定存在的可能不存在
? ? ? ? 實驗分為兩部分:
- 查找集合中不存在的元素
- 查找集合中存在的元素
? ? ? ? 由于布隆過濾器存在一定的誤算率,所以在1的場景下,存在判定元素存在的可能性(存在誤算率)。
? ? ? ? 我們使用的是https://github.com/ArashPartow/bloom版本的實現,它可以指定誤算率。
? ? ? ? 由于散列計算需要時間,所以數據的長度也將是一個比較因子。于是上述每個實驗都有三個影響因素
- 誤算率
- 集合大小
- 數據長度
查找集合中不存在的元素? ? ?
不同數據長度
? ? ? ? 在集合大小(65536)和誤算率(0.1)確定的情況下,我們比較不同數據長度下,unordered_multiset、bloomfilter的構建,和它們查找1024個不存在的元素的時間消耗。
構建時間
? ? ? ??可以見得,查找(search)時間比構建(build)時間要少很多。
? ? ? ? 當數據長度小于500時,bloomfilter比unordered_multiset構建時間要短。但是隨著數據長度的增長,前者將花費更多的時間。也就是說unordered_multiset和bloomfilter的構建時間都符合線性增長規律,但是unordered_multiset初始耗時比bloomfilter要長,但是其增長系數比后者小。
查找時間
? ? ? ? 再看下查找(search)時間? ??
? ? ? ? 在數據長度低于80時,bloomfilter比unordered_multiset要快。但是隨著數據長度的增加,前者越來越慢。當數據長度達到30000時,存在2倍多的差距。
? ? ? ? 隨著數據長度增加,bloomfilter的查找時間比unordered_multiset要長。
? ? ? ? 上述趨勢規律在數據個數比較小時也適合,只是交叉點有所變化
不同集合大小
? ? ? ? 在數據長度(256)和誤算率(0.1)確定的情況下,我們比較不同集合大小時,unordered_multiset、bloomfilter的構建,和它們查找1024個不存在的元素的時間消耗。
構建耗時
? ? ? ? 在相同數據長度的情況下,bloomfilter比unordered_multiset構建速度要快些,而且隨著集合個數增長,其優勢更加明顯。
查找時間
? ? ? ? 當集合個數少于1,000,000個時,bloomfilter的查找還是比unordered_multiset慢,但是unordered_multiset隨著集合大小增長會越來越慢。一旦超過閥值,unordered_multiset就永遠比bloomfilter要慢了。而bloomfilter的查找速度一直比較穩定。
不同誤算率
? ? ? ? 在數據長度(256)和集合個數(1048576)確定的情況下,我們比較不同誤算率下,unordered_multiset、bloomfilter的構建,和它們查找1024個不存在的元素的時間消耗。
構建時間
? ? ? ? 因為unordered_multiset和誤算率沒有關系,而且數據長度和集合大小固定,所以它幾乎是條直線。但是我們看到隨著誤算率的降低,bloomfilter的構建速度也在變慢。
查找時間
? ? ? ? 由于unordered_multiset和誤算率無關,所以其查找時間也幾乎是條直線。但是隨著誤算率降低,bloomfilter的查找時間越來越高。
查找集合中存在的元素
? ? ? ? 經過實驗,其結果和“查找集合中不存在的元素”規律一致,這兒就不把圖再羅列了。
總結:
- 隨著集合個數增長,unordered_multiset的查找速度越來越慢。而bloomfilter比較穩定。個數較少時bloomfilter比unordered_multiset慢,但是超過一定閥值,bloomfilter將比unordered_multiset快。
- 隨著數據長度增長,bloomfilter的查找速度越來越慢。而且速度比unordered_multiset慢較多。
- 隨著誤算率降低,bloomfilter的查找速度越來越慢。
- 除了內存因素外,檢測bloomfilter是否是適合應用場景,需要基于上面三個因素做實驗之后才能判斷。
? ? ? ? 測試代碼和生成圖的代碼見https://github.com/f304646673/test_bloomfilter
總結
以上是生活随笔為你收集整理的C++拾取——Linux下实测布隆过滤器(Bloom filter)和unordered_multiset查询效率的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Gin源码解析和例子——中间件(midd
- 下一篇: Golang反射机制的实现分析——ref