我开源过一个高频框架,说一下高频框架做的事,你就知道为什么要用C++了。
高频并不是并发有多少,其实是追求的低延时,如果从网络协议开始优化,可以使用RDMA可编程网卡硬件,也可以使用DPDK这种网卡旁路技术;我们暂且不关注操作系统以下层面的优化,我们聊一下基于安装了普通操作系统的计算机交易所行情数据从到达网卡到你的交易策略计算完发出开仓或平仓消息这段时间计算机做了什么!
数据从网卡接收到一堆数据流,这时候网卡产生硬件中断操作系统介入通过协议栈解析出tcp的包格式,回复tcp的ack包,数据被存入操作系统缓冲区内等待着你的程序来recv ,当操作系统的调度到你的程序的时候,你的程序会通过系统调用(注意这里不是普通的函数调用,系统调用同样需要内核参与,内核参与就需要cpu从用户态切换到内核态),把数据copy出来,为什么先copy出来而不是直接使用,因为要最小化占用系统调用时间,系统缓冲区有大小限制长时间占用会导致缓冲区满了无法继续接收tcp的数据,详细可了解tcp的滑动窗口机制,好啦现在数据已经到达了你的程序空间,你要做的就是利用这些数据计算出一个结果然后执行开平仓,要想让这个过程最快,我们要做的就是,让我们把线程绑定到固定的cpu核心去执行,这么做有个好处就是计算也会加快,下面是计算这块低延时,首先考虑的是算法一定最优,然后考虑cpu缓存,一般cpu有三个等级缓存,一级,二级缓存在内核独享,三级缓存多核共享,一个数据要经过cpu计算首先从要读取寄存器设置状态计算写入内存,读取的过程中经历3级缓存,为了充分利用缓存我们可以刚才说的线程绑核就起作用了,讲我们框架的策略计算线程绑定到固定核心上,这样一二级缓存不会失效,三级缓存失效概率会降低,从而达到低延时读取数据的目的,现在已经优化到数据在寄存器阶段,下一步就是计算,计算一般就是简单粗暴的超频cpu!过程基本就是这样,还有一块缓存刷新机制,cpu的缓存机制也是按页分配缓存大小,这里有个技巧就是在用变量的时候尽量用和缓存页大小一致的类型,避免变量被分配到两个页中,缓存刷新的时候需要刷新两页,还有内存对齐,这种都属于技巧方面的!关于网卡硬件优化,链路优化自己操作系统优化和本题中关系不大,我有一篇文章专门介绍了从链路优化硬件优化操作系统优化到交易软件优化的全过程,感兴趣的同学可以关注下
看到这里我觉得不用解释为什么不用java了吧,因为中间隔了个jvm上面说的这些都搞不来啊!
作者:80后程序员
链接:https://www.zhihu.com/question/50658420/answer/2958182956