febird.DataIO 和 boost.serialization 编译性能对比
C++ 程序的性能,重要的不光是运行性能,还有编译性能。运行性能就不多说了,编译性能往往被大家忽略,但是,想一下,如果编译一次要花一小时,那每天能编译几次?
和 boost.serialization 相比,febird.DataIO 的运行性能和编译性能都压倒性地胜出:
运行性能(针对 POD 数据,基本用法)
febird 序列化声明
1 |
DATA_IO_LOAD_SAVE(Class, &a&b&c) |
也可以为 boost 定义一个宏,语法就跟febird的序列化声明相同
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 version) \ { ar Members; } |
因为febird进行了自动优化,而boost需要用户执行优化。并且febird可以在不改变的代码的情况下,就可以写成Portable数据格式,即使使用Portable,转化了字节序,仍然比boost快得多(10倍以上)。但是对基本数据类型的vector,两者的性能差不多,因为boost对简单数据类型做了优化。
读写文件
前提是在缓存的情况下,对POD数据的操作,平均快20倍:
文件 | boost配置 | febird配置 | |
---|---|---|---|
Writer | boost::archive::binary_oarchive | NativeDataOutput<OutputBuffer<FileStream> > | |
Reader | boost::archive::binary_iarchive | NativeDataInput<InputBuffer<FileStream> > |
读写内存
平均快50倍,极速模式甚至比 boost 快了 1500 倍
内存 | boost配置 | febird配置 | febird极速模式 |
Writer | boost::archive::binary_oarchive | NativeDataOutput<AutoGrowMemIO> | NativeDataOutput<MinMemIO> |
Reader | boost::archive::binary_iarchive | NativeDataInput<MemIO> | NativeDataInput<MinMemIO> |
编译性能
- 使用自动生成的代码,迭代所有的基本类型,shuffle后生成20个POD类型。
- 对stl标准容器和基本类型代码迭代,生成20个complex类型。
- 然后读写这些类型。
编译+连接时间 | 目标文件尺寸(KB) | ||
*.exe | *.pdb | ||
boost-debug | 61秒 | 5,739 | 30,627 |
febird-debug | 23秒 | 2,129 | 14,771 |
boost-release | 155秒 | 1,794 | 14,775 |
febird-release | 54秒 | 384 | 4,451 |
下了代码初看了一次,很优秀的代码。
最近公司在做这方面的东西,主要想封装打包解包,或许可以从你的代码中借鉴一些东西
以后有不懂的地方希望可以向你请教
回复 tangb4c:欢迎交流