高频交易系统为何都是基于C++开发的?

2023-11-11


我开源过一个高频框架,说一下高频框架做的事,你就知道为什么要用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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

高频交易系统为何都是基于C++开发的? 的相关文章

随机推荐

  • 凌晨睡不着,想起了童年,写首诗吧,就叫《童年》

    雪夜里轻快又谨慎的踩雪声 印出稚嫩的脚印 一个胆大又怯懦的孩童 把手电筒插在帽兜里当做矿灯照明 微声哼着只有自己能听到的歌 沧桑的锁有节奏地拍打着大门 发出心里人的归家之念 炕上坐着的妇女 闻声而来 夏日晌午的小孩 在庭院里逗着毛虫 趁着无
  • SOTA模型训练笔记(完善中)

    文章目录 记录感知SOTA模型训练的过程 1 语义分割 1 PolarNet 2 Cylinder3D 2 视觉人体姿态识别 1 ViTPose 3 点云目标检测 1 centerpoint 记录感知SOTA模型训练的过程 1 语义分割 1
  • windows 使用docker安装elasticsearch报错

  • 使用ensp搭建简单校园网拓扑

    使用ensp搭建简单校园网拓扑 一 校园网拓扑 1 每台电脑代表一个vlan 2 二层交换机向下的每个端口需要做access 向上的每个端口需要做trunk 3 三层交换机向下的每个端口需要做trunk 而且需要为每个vlan接口配置ip地
  • Intellij IDEA2017.3.5安装

    1 下载安装包及 链接 https pan baidu com s 16az6tmQub bOn2CFOXLa2g 提取码 7689 复制这段内容后打开百度网盘手机App 操作更方便哦 2 将下载的JetbrainsCrack 2 7 re
  • js中(...)用法

    1 深拷贝一个对象 如上图所示 obj和tmp是完全两个独立的对象 互不影响 2 数组复制 3 函数形参中的使用 这里的 args 是对test函数中多余的参数进行收集 并转换成数组的形式进入函数体中 4 一种特殊情况 当数组里面套对象的时
  • sql 时间函数(全)

    Cite http www jb51 net article 20832 htm 1 当前系统日期 时间 select getdate 2 dateadd 在向指定日期加上一段时间的基础上 返回新的 datetime 值 例如 向日期加上2
  • C++结构体对齐问题

    规则1 结构体成员的内部偏移量 内部地址 要被这个成员的数据类型大小整除 规则2 整个结构体的大小 必须是最大成员的size整数倍 否则就需要在末尾补充空白字节 规则3 对于结构体中的结构体 按照结构体展开之后的内存对齐来处理 规则4 人为
  • 余老师带你学习大数据框架全栈第十三章Hudi第一节核心技术

    1 前言 1 1为什么产生数据湖 数据量比较大 越来越不满足处理结构化的数据 比如说数仓 数仓就是处理结构化数据 什么是结构化数据 就是数据成数据库来的 传统型的数据库有 MySQL数据库 Oracle SQLserver 从这些库里面过来
  • TensorFlow基础(1)-中使用多个 Graph

    代码中有时候会遇到 with tf Graph as default 其实这个可以有也可以没有 可能是可以让自己的思路更加清楚吧 知道这里开始新建图了 tensorflow官方教程 翻译 简介 当我们训练一个模型时 通常的做法是用一个 Gr
  • 公开课机器学习笔记(13)支持向量机三 核函数

    2 2 核函数Kernel 2 2 1 特征空间的隐式映射 核函数 咱们首先给出核函数的来头 在上文中 我们已经了解到了SVM处理线性可分的情况 而对于非线性的情况 SVM 的处理方法是选择一个核函数 通过将数据映射到高维空间 来解决在原始
  • DCL详解

    一 什么是DCL问题 在Java中 DCL通常指的是Double Checked Locking 双重检查锁定 DCL是一种用于多线程环境下懒加载单例对象的技术 它的基本思路是在对象还未被实例化时 先通过一次判空 避免了每次获取对象时都需要
  • JavaScript 数组find() 方法

    定义和用法 find 方法返回通过测试 函数内判断 的数组的第一个元素的值 find 方法为数组中的每个元素都调用一次函数执行 当数组中的元素在测试条件时返回 true 时 find 返回符合条件的元素 之后的值不会再调用执行函数 如果没有
  • C++指针的用法/指针与引用的区别

    指针的简介 计算机程序本质上是对存储在内存中的数据进行的一系列操作 既然要对数据进行操作 首先要解决的第一个问题就是数据存储在什么地方 一般情况下我们通过int x 10 来定义一个变量 可以通过x来直接访问该变量存储的值 而指针提供了另外
  • 启动和关闭ADB服务(adb start-server和adb kill-server)

    经作者测试 模拟器在运行一段时间后 adb服务有可能 在Windows进程中可找到这个服务 该服务用来为模拟器或通过USB数据线连接的真机服务 会出现异常 这时需要重新对adb服务关闭和重启 当然 重启Eclipse可能会解决问题 但那比较
  • C语言

    1024G 嵌入式资源大放送 包括但不限于C C 单片机 Linux等 关注微信公众号 嵌入式大杂烩 回复1024 即可免费获取 函数指针有两种常用的用法 一种是作为结构体成员 关于函数指针作为结构体成员的用法可移步至上一篇 C语言笔记 函
  • javascript 对象的定义(JS中定义类的方式有很多种)

    javascript 对象的定义 2007 04 19 21 47 43 个人分类 JS javascr pt 对象的定义 JS中定义类的方式有很多种 1 工厂方式 function Car var car new Object ocar
  • 亲测!纯净不限速的驱动大师

    哈喽 大家好 最近又发现一个宝贝级的电脑驱动下载安装 360驱动大师 是不是有小伙伴要骂我了 先等等 等你看完小编的亲测结果 你就知道他的香了 一提到360呀 感觉大家对他的影响都不太好 因为在日常生活中它总会给我们带来莫名其妙的弹窗烦恼
  • 《数据挖掘导论》学习笔记-特征创建

    根据原有的属性我们可以创建出新的属性集 而且新的属性数目可能少于原有的属性数目 也就是降维 创建新的属性的方法有三种 特征提取 映射数据到新的空间 特征构造 1 特征提取 定义 根据原有的数据自己创建新的属性集 有的数据的属性是非常多的 而
  • 高频交易系统为何都是基于C++开发的?

    我开源过一个高频框架 说一下高频框架做的事 你就知道为什么要用C 了 高频并不是并发有多少 其实是追求的低延时 如果从网络协议开始优化 可以使用RDMA可编程网卡硬件 也可以使用DPDK这种网卡旁路技术 我们暂且不关注操作系统以下层面的优化