`
febird
  • 浏览: 247324 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

febird.dataio 优化技术

阅读更多

优化技术主要有以下几点:

1.         优化的inline

a)         频繁调用的函数都使用inline,但是值得注意的是,在inline的时候,只inline最频繁的分支,很少走到的分支使用非inline函数,例如:

inline void InputBuffer::ensureRead(void* vbuf, size_t length)

{

    // 为了效率,这么实现可以让编译器更好地inline这个函数

// inline 后的函数体并尽可能小

    if (m_cur+length <= m_end) {

        memcpy(vbuf, m_cur, length);

        m_cur += length;

    } else

        fill_and_ensureRead(vbuf, length);

}

一般情况下,如果length是个不大的常数值,编译器会把memcpy优化成赋值语句。至少在VC2008中我观察到了这个优化。

但是这里仍有一种不太优化的情况,在理想的情况下,编译器应该把m_cur/m_end都放在寄存器中,只有在溢出的时候,才把它们的值从寄存器拷到对象,并调用fill_and_ensureRead。但实际上编译器没有这么做,每次都存内存读取m_cur/m_end。这可能是编译器观察到InputBuffer有点大,并且有虚函数。

b)         MinMemIO/MemIO/AutoGrowMemIO

这个几个效率更高,但只能在内存中操作,编译器的极端优化,在这里得到了体现:在Buffer类中,编译器没有做到我想要的优化,但是在这里,编译器做到了,他吧MinMemIO放到了寄存器中。

2.         抛弃标准C++ stream,使用简单、直接的Stream/Buffer

可以对各种流进行快速缓冲的StreamBuffer,结构简单,操作直接,结合编译器inline可以达到很高的效率,同时可以和实际Stream互操作。

3.         使用typetraits识别可以memcpy的类,进一步优化

a)         基本类型不用说,都可以进行memcpy,并且这个memcpy实际上被优化成了赋值

b)         对稍微复杂的类型,有两种方法:

                         i.     直接dump,不管它的格式

实现简单,只管dump就行,boost::archive::binary_xxx实现了这种优化,但是它只能对基本类型和用户声明为可直接dump的类优化。并且如果febird也这样优化,将不能对Portable格式优化。

                       ii.     直接dump,再转化格式

就比较复杂,需要一些技巧,febird做到了一点,并且不管对Native还是Portable格式,都做到了优化。因为序列化使用宏来进行声明,因此,应用代码不用改变,只要认真优化这个宏,就可以做到。febird使用了这样的技巧:

DATA_IO_LOAD_SAVE(MyData1, &a&b&c&d&e&f&g&h)

在这个宏调用中第二个参数&a&b&c&d&e&f&g&h被使用了多次,其中有一次展开后将是是这样的:

DataIO_load_vector_opt(dio, *this,              \

    DataIO_is_realdump<DataIO,0,true>()&a&b&c&d&e&f&g&h,    \

            bswap)

 

其中高亮部分DataIO_is_realdump<DataIO,0,true>()&a&b&c&d&e&f&g&h将推导出一个类DataIO_is_realdump<DataIO, Size, IsDumpable>,其中Sizeabcdefgh的尺寸之和,IsDumpable abcdefghIsDumpableand结果,DataIO_load_vector_opt以这个类为参数,进行函数调用的自动分派,如果Size==sizeof(MyData1)就说明MyData中没有编译器为对齐成员自动产生的Padding,如果IsDumpable同时为true,那么这个类就可以被dump。但是这里仍然有一个潜在的危险:如果&a&b&c&d&e&f&g&h的顺序和它们在类定义中出现的顺序不同,那么这个优化产生的行为将违背调用者的真实意图。关于这一点,无法进行自动检查,因此使用者需要特别注意。如果要测试是否出现了这种错误,可以先禁用这种优化,产生数据,然后使用优化,来读取数据,如果数据格式不同,就说明出了错

4.   使用了这么多优化,达到的效果,平均情况下,如果是基本类型vector,比boost快不了太多,但是对复杂类型,比boost20~50,如果数据已经过验证,不用担心越界,读取时可以使用NativeDataInput<MinMemIO>,此时速度更加惊人:boost1600倍!

5.   Portable格式优化

byte_swap尽量使用intrinsic,目前仅在vcgcc4.3.2以上实现优化。其他平台使用非优化形式。

6.   注意事项:

a)   嵌套结构中有复杂对象肯定无法使用memcpy的,当然也无法优化

b)   如果类型是带版本的,也无法优化

c)   如果只使用通常的声明DATA_IO_LOAD_SAVE(MyData, &a&b&c)来声明序列化,当MyData被其他类型如MyData2嵌套时,MyData2就无法优化了,如果想让febird优化,需要显式声明它是dumpable的:DataIO_IsDump_TypeTrue1,但是

分享到:
评论

相关推荐

    febird C++ 库(附带所有源码)

    febird.rpc is a C++ remote procedure call without an IDL supporting, it based on the serialization framework. febird.rpc provide convenient usage and fast performance, and an uniform coding style. ...

    rpc-Remote Procedure Call源码2

    远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

    6-10.py

    6-10

    基于机器学习的入侵检测系统+源码+说明.zip

    基于机器学习的入侵检测系统+源码+说明.zip

    matlab基于潜在低秩表示的红外与可见光图像融合.zip

    matlab基于潜在低秩表示的红外与可见光图像融合.zip

    4-5.py

    4-5

    基于tensorflow使用简单线性回归实现波士顿房价预测源码.zip

    基于tensorflow使用简单线性回归实现波士顿房价预测源码.zip

    setuptools-25.1.0-py2.py3-none-any.whl

    文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    pytest-8.0.0-py3-none-any.whl

    文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    pytest-2.1.2.zip

    文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    GDAL-3.2.2-cp38-cp38-win-amd64.whl

    GDAL-3.2.2-cp38-cp38-win_amd64.whl

    3-11-1.py

    3-11-1

    Scrapy-2.5.0.tar.gz

    文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    课程大作业二手车价格预测案例数据挖掘python源码+数据集+实验报告+详细注释.zip

    课程大作业二手车价格预测案例数据挖掘python源码+数据集+实验报告+详细注释.zip

    setuptools-24.0.3-py2.py3-none-any.whl

    文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    pytest-6.2.1-py3-none-any.whl

    文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    麦肯锡—xx科技业务流程改造报告.ppt

    麦肯锡—xx科技业务流程改造报告.ppt

    麦肯锡—xx阶段一报告.ppt

    麦肯锡—xx阶段一报告.ppt

    基于MPC模型预测控制从原理到代码的matlab实现源码+文档说明.zip

    基于MPC模型预测控制从原理到代码的matlab实现源码+文档说明.zip

    setuptools-35.0.0-py2.py3-none-any.whl

    文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

Global site tag (gtag.js) - Google Analytics