尝试读取国内交易所行情(LEVEL1的行情,是dbf格式的,基本上3s到6s刷新一次;两家交易所的dbf文件合起来有1~2Mb的样子)
首次,使用C++读取,漫不经心使用的了一堆现成data structure,发现读取行情的程序需要100ms级别的时间。不甚满意。
第二次,使用R直接读取,发现在50~60ms。有提速。
第三次,读取R读取dbf的源代码,发现是一个dbview的项目用过的代码,阅读了下,用C重写写了,程序运行需要时间为20ms。觉得应该还有改进空间,因为交易所的数据格式是“相对固定的”(记录数量会改变,但是字段定义不会变,除非交易所升级版本)
第四次,找到交易所对当前行情版本的定义,利用这些信息后的C语言版本(大量使用各种转化库函数),提速到10ms左右。分析代码发现,可以一次性将文件读取到内存中,直接操作内存,也许速度会继续提升。
第五次,大量使用C语言中的memcpy等函数,直接操作一次性读取(unsigned char,二进制格式)到(malloc\calloc\realloc\free等函数)内存中,然后使用atoi\atof等转化函数。读取行情所需要时间控制在2ms之内了。
BTW:以上速度是在一台Windows环境下VC2010 Debug方式下得到的C语言实现,R测速也是同一电脑。
小结:
1、使用C的指针及其相关函数直接操作内存,效率高
2、尽可能把文件的内容一次性读取到内存中,而不要总是fseek来定位之后再fread(可能依赖不同操作系统在硬盘和内存之间的处理方式,这点上*NIX比Windows好太多)(不过同一台电脑上没装*NIX,所以不好直观比较,只是以前在同一台电脑上装过Windows和*NIX的系统做过同样文件处理和数值计算的活,*NIX明显快超过50%)
3、如果想在未来的金融交易中和人抢单快,弄好C、榨取操作系统和硬件的性能是比较必要的。
4、这么做是否比较无聊!?毕竟国内交易所还没100ms以内传递行情。