日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

boost的multi_index性能测试

發布時間:2024/2/28 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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性能测试的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。