febird.dataio vs boost.serialization 运行性能对比
代码表示的是数据格式,DATA_IO_LOAD_SAVE 在 <febird/io/DataIO.h> 中定义
对于 boost.serialization
, DATA_IO_LOAD_SAVE
的定义相当于:
1 2 3 4 5 |
#define DATA_IO_LOAD_SAVE(Class, Members) \ friend class boost::serialization::access; \ template<class Archive> \ void serialize(Archive & ar, const unsigned int version) \ { ar Members; } |
数据格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
struct MyData1 { uint32_t a, b, c; uint32_t d[5]; DATA_IO_LOAD_SAVE(MyData1, &a&b&c&d) }; struct MyData2 { uint32_t a, b, c, d; MyData1 e; DATA_IO_LOAD_SAVE(MyData2, &a&b&c&d&e) }; struct MyData3 { uint32_t a, b, c; uint32_t d; }; DATA_IO_DUMP_RAW_MEM(MyData3) struct VarIntD { var_uint32_t a, b, c, d, e, f; VarIntD() { a = 127; b = 128; c = 128*128; d = 128*128*128; e = 128*128*128*128; f = 1; } DATA_IO_LOAD_SAVE(VarIntD, &a&b&c&d&e&f) }; typedef pair<MyData2, MyData3> MyData23; |
写入性能
写入,表示序列化(serialize),也称为存储(save)
表1:写入性能,时间单位是微秒(us),loop 表示相同的数据重复写 count 次,而不是写 .size() 个不同的数据
比 boost 快 10 倍以上的项目标红,快 30 倍以上的 粗体红
class | .size() | boost | File Native | File Portable | Memory Native | Memory Portable | Unchecked Native | Unchecked Portable | ||||||
loop | ||||||||||||||
count | 时间 | 时间 | 速度比 | 时间 | 速度比 | 时间 | 速度比 | 时间 | 速度比 | 时间 | 速度比 | 时间 | 速度比 | |
vector<pair<int,int> > | 4000 | 1004 | 593 | 1.69 | 1114 | 0.90 | 198 | 5.07 | 557 | 1.80 | 173 | 5.78 | 518 | 1.94 |
vector<MyData1> | 4000 | 23918 | 1043 | 22.93 | 4044 | 5.91 | 510 | 46.86 | 2392 | 10.00 | 480 | 49.81 | 2415 | 9.90 |
vector<string> | 4000 | 9266 | 3741 | 2.48 | 3480 | 2.66 | 3088 | 3.00 | 2916 | 3.18 | 2480 | 3.74 | 2430 | 3.81 |
map<int,string> | 3756 | 19434 | 5018 | 3.87 | 5089 | 3.82 | 3679 | 5.28 | 3563 | 5.45 | 3436 | 5.66 | 3599 | 5.40 |
loop{MyData1} | 4000 | 23592 | 2898 | 8.14 | 3622 | 6.51 | 1106 | 21.33 | 2203 | 10.71 | 1070 | 22.04 | 2037 | 11.58 |
loop{VarIntD} | 4000 | 52832 | 8664 | 6.10 | 7255 | 7.28 | 7546 | 7.00 | 7307 | 7.23 | 7110 | 7.43 | 7476 | 7.07 |
vector<MyData23> | 4000 | 68581 | 5768 | 11.89 | 6831 | 10.04 | 2242 | 30.59 | 3742 | 18.32 | 2155 | 31.82 | 3740 | 18.33 |
取该表格中的时间项,生成柱状图如下:
读取性能
读取,表示反序列化(deserialize),也称为加载(load)
表2:读取性能,时间单位是微秒(us), loop 表示相同的数据重复读 count 次,而不是读 .size() 个不同的数据
比 boost 快 20 倍以上的项目 标红,快 50 倍以上的 粗体红
class | .size() | boost | File Native | File Portable | Memory Native | Memory Portable | Unchecked Native |
Unchecked Portable |
||||||
loop | ||||||||||||||
count | 时间 | 时间 | 速度比 | 时间 | 速度比 | 时间 | 速度比 | 时间 | 速度比 | 时间 | 速度比 | 时间 | 速度比 | |
vector<pair<int,int> > | 4000 | 766 | 400 | 1.92 | 500 | 1.53 | 170 | 4.49 | 301 | 2.55 | 172.00 | 4.45 | 281 | 2.72 |
vector<MyData1> | 4000 | 26738 | 868 | 30.79 | 1543 | 17.33 | 505 | 52.91 | 1182 | 22.61 | 530 | 50.37 | 1199 | 22.29 |
vector<string> | 4000 | 41097 | 3812 | 10.78 | 3924 | 10.47 | 3134 | 13.11 | 3150 | 13.05 | 2985 | 13.77 | 2731 | 15.04 |
map<int,string> | 3756 | 63985 | 58671 | 1.09 | 58689 | 1.09 | 58097 | 1.10 | 57657 | 1.11 | 57228 | 1.12 | 57136 | 1.12 |
loop{MyData1} | 4000 | 23486 | 1547 | 15.18 | 2957 | 7.94 | 114 | 205.55 | 1549 | 15.16 | 17 | 1355.98 | 1578 | 14.88 |
loop{VarIntD} | 4000 | 88218 | 2580 | 34.19 | 2575 | 34.25 | 4586 | 19.23 | 4610 | 19.13 | 2472 | 35.68 | 2628 | 33.56 |
vector<MyData23> | 4000 | 75386 | 4667 | 16.15 | 5375 | 14.02 | 1894 | 39.79 | 2650 | 28.44 | 1838 | 41.00 | 2420 | 31.15 |
其中,205.55 和 1355.98 这两个数字,我自己也非常吃惊,甚至感觉有点不可思议,但是,这就是实测结果!
取该表格中的时间项,生成柱状图如下:
学习了febird作品,对楼主的奉献精神敬佩不已,呵呵~~
好像febird很久没有更新了。下载新的代码,其中有好多第三方库并没有被引用,致使编译困难啊。
另外,dataio好像没有实现类内部指针的序列化,这可能限制了大多实际项目的序列化使用。
小的更新还是有的,大的更新的确很久都没有了,我会尽量让编译容易点
指针的序列化一般跟具体应用高度相关,这样的事还是让 app 来做,程序员都是很聪明的,越俎代庖不光给自己添麻烦,也给使用者添乱。我故意disable了指针的序列化,如果尝试序列化指针,会有编译错误的