msgpack[C++]使用笔记 和 msgpack/cPickle性能对比

简介:

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的一个复杂字典

[cpp]   view plain copy
  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

[cpp]   view plain copy
  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 plain copy
  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 plain copy
  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 plain copy
  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)  
目录
相关文章
|
6月前
|
Java Linux C++
性能工具之 C/C++ 分析工具 valgrind
【5月更文挑战第26天】性能工具之 C/C++ 分析工具 valgrind
116 2
性能工具之 C/C++ 分析工具 valgrind
|
5月前
|
算法 C++
算法笔记:递归(c++实现)
算法笔记:递归(c++实现)
|
5月前
|
编译器 C++
《Effective C++ 改善程序与设计的55个具体做法》 第一章 笔记
《Effective C++ 改善程序与设计的55个具体做法》 第一章 笔记
|
3月前
|
C++ 容器
【C/C++笔记】迭代器
【C/C++笔记】迭代器
26 1
|
4月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
【7月更文挑战第28天】在 Android 开发中, NDK 让 Java 与 C++ 混合编程成为可能, 从而提升应用性能。**为何选 NDK?** C++ 在执行效率与内存管理上优于 Java, 特别适合高性能需求场景。**环境搭建** 需 Android Studio 和 NDK, 工具如 CMake。**JNI** 构建 Java-C++ 交互, 通过声明 `native` 方法并在 C++ 中实现。**实战** 示例: 使用 C++ 计算斐波那契数列以提高效率。**总结** 混合编程增强性能, 但增加复杂性, 使用前需谨慎评估。
141 4
|
3月前
|
存储 安全 程序员
【C/C++笔记】迭代器范围
【C/C++笔记】迭代器范围
68 0
|
4月前
|
Rust 安全 编译器
Rust与C++的区别及使用问题之Rust中的bound check对性能产生影响的问题如何解决
Rust与C++的区别及使用问题之Rust中的bound check对性能产生影响的问题如何解决
|
4月前
|
C++ Windows
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
在Windows上使用Visual Studio 2022进行FFmpeg和SDL2集成开发,首先安装FFmpeg至E:\msys64\usr\local\ffmpeg,然后新建C++控制台项目。在项目属性中,添加FFmpeg和SDL2的头文件及库文件目录。接着配置链接器的附加依赖项,包括多个FFmpeg及SDL2的lib文件。在代码中引入FFmpeg的`av_log`函数输出"Hello World",编译并运行,若看到"Hello World",即表示集成成功。详细步骤可参考《FFmpeg开发实战:从零基础到短视频上线》。
168 0
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
|
6月前
|
算法 C++ 容器
黑马c++ STL常用算法 笔记(5) 常用算术生成算法
黑马c++ STL常用算法 笔记(5) 常用算术生成算法
|
6月前
|
算法 C++ 容器
黑马c++ STL常用算法 笔记(4) 常用拷贝和替换算法
黑马c++ STL常用算法 笔记(4) 常用拷贝和替换算法