boost的multi_index性能测试
生活随笔
收集整理的這篇文章主要介紹了
boost的multi_index性能测试
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上一篇我們總結了boost的multi_index的各種使用方法
詳見:boost的multi_index的使用
這一篇我們測試下boost的實際性能如何,從插入,查詢,刪除等幾個方面進行測試
結論如下:
1. multi_index的性能比STL的map性能較差,不過也在同一個數量級上
2. multi_index的刪除效率較差,大概比插入效率低了25倍
3. multi_index的插入,查詢在debug模式下效率很差,在release模式下效率非常高,差距超過10倍!刪除效率倒是相差不大
? ?原因詳情可見:?https://david-joe2005.iteye.com/blog/487391
實驗如圖:
Debug模式: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Release模式:
?? ? ? ? ? ? ?
完整測試代碼如下:
#include <cstdio> #include <map> #include <vector> #include <string> #include <sstream> #include <boost/multi_index_container.hpp> #include <boost/multi_index/mem_fun.hpp> #include <boost/multi_index/member.hpp> #include <boost/multi_index/ordered_index.hpp> #include <boost/smart_ptr.hpp> #include <iostream> #include <boost/progress.hpp>using boost::multi_index_container; using namespace boost::multi_index; using namespace std; using namespace boost;// 玩家信息 class CPlayer { public:CPlayer(int id, string name):id(id),name(name){ }int id; // 唯一idstring name; // 名字 };struct id{}; struct name{};// 定義player容器 typedef boost::multi_index_container<CPlayer,indexed_by<ordered_unique<tag<id>, BOOST_MULTI_INDEX_MEMBER(CPlayer, int, id)>,ordered_non_unique<tag<name>, BOOST_MULTI_INDEX_MEMBER(CPlayer, string, name)>> > PlayerContainer;typedef map<int,CPlayer*> Map_Id_Player; typedef map<string,CPlayer*> Map_Name_Player; typedef vector<CPlayer*> Vec_Player;int main() {PlayerContainer playerContiner; // 容器Map_Id_Player mapIdPlayer; // map id->playerMap_Name_Player mapNamePlayer; // map name->player// 100萬次測試int testNum = 1000000;Vec_Player vecPlayer;// 初始化for(int i=0;i<testNum;i++){vecPlayer.push_back(new CPlayer(i,"player"));}// 隨機打亂std::random_shuffle(vecPlayer.begin(), vecPlayer.end());cout<<"開始測試:執行次數:"<<testNum<<endl;/ 插入測試 /{cout<<"multi_index插入耗時:";progress_timer t;for (Vec_Player::iterator iter=vecPlayer.begin();iter!=vecPlayer.end();iter++){playerContiner.insert(**iter);}// progress_timer變量會在創建時計時,析構時自動打印出耗時,下同,不再解釋}{cout<<"map插入耗時:";progress_timer t;for (Vec_Player::iterator iter=vecPlayer.begin();iter!=vecPlayer.end();iter++){mapIdPlayer.insert(Map_Id_Player::value_type((*iter)->id,*iter));mapNamePlayer.insert(Map_Name_Player::value_type((*iter)->name,*iter));}}/ 查詢測試 /{cout<<"multi_index查詢耗時:";progress_timer t;PlayerContainer::index<id>::type& player_ID = playerContiner.get<id>();PlayerContainer::index<name>::type& player_NAME = playerContiner.get<name>();for (Vec_Player::iterator iter=vecPlayer.begin();iter!=vecPlayer.end();iter++){player_ID.find((*iter)->id);player_NAME.find((*iter)->name);}}{cout<<"map查詢耗時:";progress_timer t;for (Vec_Player::iterator iter=vecPlayer.begin();iter!=vecPlayer.end();iter++){mapIdPlayer.find((*iter)->id);mapNamePlayer.find((*iter)->name);}}/ 刪除測試 /{cout<<"multi_index刪除耗時:";progress_timer t;PlayerContainer::index<id>::type& player_ID = playerContiner.get<id>();for (Vec_Player::iterator iter=vecPlayer.begin();iter!=vecPlayer.end();iter++){player_ID.erase(player_ID.find((*iter)->id));}}{cout<<"map刪除耗時:";progress_timer t;for (Vec_Player::iterator iter=vecPlayer.begin();iter!=vecPlayer.end();iter++){Map_Id_Player::iterator result1 = mapIdPlayer.find((*iter)->id);if (result1 != mapIdPlayer.end()){mapIdPlayer.erase(result1);}Map_Name_Player::iterator result2 = mapNamePlayer.find((*iter)->name);if (result2 != mapNamePlayer.end()){mapNamePlayer.erase(result2);}}}cout<<"結束測試:執行次數:"<<testNum<<endl;getchar();return 0; }?
總結
以上是生活随笔為你收集整理的boost的multi_index性能测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: boost的multi_index的使用
- 下一篇: boost之timer,progress