• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            msgpack[C++]使用筆記 和 msgpack/cPickle性能對比

            轉載自:http://blog.csdn.net/xiarendeniao/article/details/6801338

            python版本msgpack安裝:

            wget http://pypi.python.org/packages/source/m/msgpack-python/msgpack-python-0.1.9.tar.gz

            python2.x setup.py install --prefix=/usr/local/similarlib/


            python版本的msgpack灰常好用,速度上比python內置的pickle和cpickle都要快一些,C++版本的使用比較麻煩,下面是本人學習時的一個demo,解析python-msgpack dump的一個復雜字典

            1. #include <msgpack.hpp>  
            2.   
            3. #include <fstream>  
            4. #include <iostream>  
            5. using namespace std;  
            6.   
            7. template <class T>  
            8. void msgunpack(const char* binary_file, T& t, char* buff, uint32_t max){  
            9.     msgpack::unpacked msg;  
            10.     ifstream tf_file(binary_file,ios::in|ios::binary|ios::ate);  
            11.     uint32_t size = tf_file.tellg();  
            12.     tf_file.seekg(0, ios::beg);  
            13.     tf_file.read(buff, size);  
            14.     tf_file.close();  
            15.     msgpack::unpack(&msg, buff, size);  
            16.     msg.get().convert(&t);  
            17. }  
            18.   
            19.   
            20. typedef map<uint32_t, uint32_t> WordsMap;  
            21. typedef map<uint32_t, WordsMap> FieldsMap;  
            22. typedef map<uint64_t, FieldsMap> DocsMap;  
            23.   
            24. int main(int argc, char** argv)  
            25. {  
            26.     uint32_t MAX_BUFF = 1024*1024*100; //100MB  
            27.     char* BUFF = new char[MAX_BUFF];  
            28.   
            29.     DocsMap docsMap;  
            30.     msgpack::unpacked msg;  
            31.     msgunpack("/data/wikidoc/tf_dict_for_nodes/1-1000", docsMap, BUFF, MAX_BUFF);  
            32.     //        msg.get().convert(&docsMap);  
            33.     cout << docsMap.size() << endl;  
            34.         delete[] BUFF;  
            35. }  



            參考: http://wiki.msgpack.org/pages/viewpage.action?pageId=1081387#QuickStartforC%2B%2B-ImplementationStatus


            下面是本人自己封裝的一個msgpack接口頭文件mymsgpack.h

            1.  #ifndef MY_MSGPACK_H  
            2.   
            3. #ifndef MY_MSGPACK_H  
            4. #define MY_MSGPACK_H  
            5. #include <fstream>  
            6. #include <msgpack.hpp>  
            7. using namespace std;  
            8.   
            9. template <class T>  
            10. void load_from_file(const char* binary_file, T& t) {  
            11.         ifstream binaryFstream(binary_file,ios::in|ios::binary|ios::ate);  
            12.         uint32_t size = binaryFstream.tellg();  
            13.         char* buff = new char[size];  
            14.         binaryFstream.seekg(0, ios::beg);  
            15.         binaryFstream.read(buff, size);  
            16.         binaryFstream.close();  
            17.         msgpack::unpacked msg;  
            18.         msgpack::unpack(&msg, buff, size);  
            19.         msg.get().convert(&t);  
            20.         delete[] buff;  
            21. }  
            22.   
            23. template <class T>  
            24. void load_from_str(const char* binary_str, int len, T& t) {  
            25.         msgpack::unpacked msg;  
            26.         msgpack::unpack(&msg, binary_str, len);  
            27.         msg.get().convert(&t);  
            28. }  
            29.   
            30. template <class T>  
            31. void dump_to_file(T& t, const char* dump_file) {  
            32.     msgpack::sbuffer sbuf;  
            33.     msgpack::pack(sbuf, t);  
            34.     ofstream dumpFstream(dump_file, ios::out|ios::binary|ios::trunc);  
            35.     dumpFstream.write(sbuf.data(), sbuf.size());  
            36.     dumpFstream.close();  
            37. }  
            38.   
            39. template <class T>  
            40. void dump_to_str(T& t, char** dump_str, int& len) { //外部釋放*dump_str  
            41.     msgpack::sbuffer sbuf;  
            42.     msgpack::pack(sbuf, t);  
            43.     len = sbuf.size();  
            44.     *dump_str = (char*)malloc(sbuf.size());  
            45.     memcpy(*dump_str, sbuf.data(), sbuf.size());  
            46. }  
            47.   
            48. #endif  


             


            msgpack編譯通過,鏈接不上的問題 undefined reference to `__sync_sub_and_fetch_4'

            在x84_64機器上正常,在32bit機器上出現上述問題

            [plain] view plaincopy
            1. [xudongsong@BigServerU-4 msgpack-0.5.7]$ cat /etc/issue  
            2. CentOS release 5.4 (Final)  
            3. Kernel \r on an \m  
            4.   
            5. [xudongsong@BigServerU-4 msgpack-0.5.7]$ file /sbin/init  
            6. /sbin/init: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped  

            ./configure不報錯,但是查看config.log顯示有錯誤,程序鏈接msgpack的庫時也報錯

            原因:gcc不能識別CPU體系,需要手動指明

            [plain] view plaincopy
            1. [xudongsong@BigServerU-4 msgpack-0.5.7]$ CFLAGS="-march=pentium -mtune=pentium" ./configure --prefix=/home/xudongsong/msgpack_static --enable-static=yes --enable-shared=no  

            make, make install

            [xudongsong@BigServerU-4 jobs]$ g++ job_calc_weight.cpp -o job_calc_weight -I/home/xudongsong/msgpack_static/include/ -L/home/xudongsong/msgpack_static/lib/ -lmsgpack

            通過!

             


             

            下面是msgpack和cPickle進行性能pk的demo程序(不比較pickle,是因為它比cPickle更慢,《Python cook book》里面有說明):

            [python] view plaincopy
            1. mport sys,time,msgpack,pickle,cPickle,random  
            2.   
            3. test_list = []  
            4. i = 0  
            5. while i<100000:  
            6.     test_list = random.randrange(1,100000)  
            7.     i += 1  
            8.   
            9. print "common len(serialize) = %s"%len(cPickle.dumps(test_list,0))  
            10. print "compress len(serialize) = %s"%len(cPickle.dumps(test_list,1))  
            11.   
            12. #------------------------------------------------------------------------  
            13. results = {}  
            14. time_start = time.time()  
            15. for i in range(1,1000000):  
            16.         results[i] = cPickle.dumps(test_list,1)  
            17. time_mid_1 = time.time()  
            18. print "cPickle dumps eats %s s"%str(time_mid_1-time_start)  
            19.   
            20. for i in range(1,1000000):  
            21.     cPickle.loads(results[i])  
            22. time_mid_2 = time.time()  
            23. print "cPickle loads eats %s s"%str(time_mid_2-time_mid_1)  
            24.   
            25. #------------------------------------------------------------------------  
            26. results = {}  
            27. time_start = time.time()  
            28. for i in range(1,1000000):  
            29.     results[i] = msgpack.dumps(test_list)  
            30. time_mid_1 = time.time()  
            31. print "msgpack pack eats %s s"%str(time_mid_1-time_start)  
            32.   
            33. for i in range(1,1000000):  
            34.     msgpack.loads(results[i])  
            35. time_mid_2 = time.time()  
            36. print "msgpack unpack eats %s s"%str(time_mid_2-time_mid_1)  

             

            posted on 2014-05-29 09:15 楊粼波 閱讀(1825) 評論(0)  編輯 收藏 引用 所屬分類: C++

            久久天天躁夜夜躁狠狠躁2022| 一级女性全黄久久生活片免费 | 久久av无码专区亚洲av桃花岛| 久久久久亚洲AV无码专区网站 | 久久亚洲精品视频| 亚洲av成人无码久久精品 | 国产精品久久久久天天影视| 无码人妻久久一区二区三区| 国产亚洲精品久久久久秋霞 | 久久久久人妻一区精品性色av| 亚洲午夜久久久久久噜噜噜| 精品久久久久成人码免费动漫| 亚洲国产成人久久综合区| 少妇久久久久久被弄到高潮| 亚洲国产一成久久精品国产成人综合 | 久久亚洲综合色一区二区三区| 欧美一区二区三区久久综合| 久久久久高潮毛片免费全部播放| 亚洲精品乱码久久久久久按摩| 伊人久久大香线蕉综合影院首页| 亚洲精品高清国产一线久久| 精品久久亚洲中文无码| 国产69精品久久久久9999APGF| 久久强奷乱码老熟女网站| 亚洲中文字幕无码久久2017| aaa级精品久久久国产片| 93精91精品国产综合久久香蕉| 久久亚洲国产成人影院网站| 无码人妻久久一区二区三区蜜桃| 国产亚洲美女精品久久久2020| 国产精品一久久香蕉国产线看| 日本一区精品久久久久影院| 久久久网中文字幕| 久久久久亚洲av综合波多野结衣| 欧洲精品久久久av无码电影| 99久久精品免费看国产| 亚洲人AV永久一区二区三区久久 | 国产精品久久久久久久午夜片 | 久久久一本精品99久久精品66 | 青青草原精品99久久精品66| 久久精品国产亚洲网站|