微科社区,轻松开发从此开始! 请登陆 免费注册

微科社区

当前位置:首页 > Java平台 > J2EE >

Java读取Level-1行情dbf文件极致优化(3)

时间:2016-06-26 07:12  浏览:努力统计中...
最近架构一个项目,实现行情的接入和分发,需要达到极致的低时延特性,这对于证券系统是非常重要的。接入的行情源是可以配置,既可以是Level-1,也可以是Level-2或其他第三方的源

最近架构一个项目,实现行情的接入和分发,需要达到极致的低时延特性,这对于证券系统是非常重要的。接入的行情源是可以配置,既可以是Level-1,也可以是Level-2或其他第三方的源。虽然Level-1行情没有Level-2快,但是作为系统支持的行情源,我们还是需要优化它,使得从文件读取,到用户通过socket收到行情,端到端的时延尽可能的低。本文主要介绍对level-1行情dbf文件读取的极致优化方案。相信对其他的dbf文件读取应该也有借鉴意义。

Level-1行情是由行情小站,定时每隔几秒把dbf文件(上海是show2003.dbf,深圳是sjshq.dbf)更新一遍,用新的行情替换掉旧的。我们的目标就是,在新文件完成更新后,在最短时间内将文件读取到内存,把每一行转化为对象,把每个列转化为对应的数据类型。

我们一共采用了6种优化方式。

 

我们在上文《Java读取Level-1行情dbf文件极致优化(1)》 《Java读取Level-1行情dbf文件极致优化(2)》中,已经介绍了4种优化策略:

优化一:采用内存硬盘(RamDisk)
优化二:采用JNotify,用通知替代轮询

优化三:采用NIO读取文件
优化四:减少读取文件时内存反复分配和GC

优化五:字段读取优化

行情dbf文件很多字段是价格类型的字段,带2位或者3位小数,从dbf读取他们的后,我们会把它们保存在Long类型或者Int类型,而不是Float或Double类型,比如1.23,转换为1230保存。因为Float型或Double型会丢失精度。

如果不优化,读取步骤为:

1,从byte[]对应的偏移中读取并保存到String中。

2,对String做trim操作

3,把String转换为Float类型

4,把Float类型乘以1000并强转为Long类型。

 

不用多说,以上的过程一定是低效的,光前两步就涉及到2次字符串拷贝,2次对象创建。第三步效率也不高。我这里通过优化,在DBFReader.java中添加一个get_long_efficiently_and_multiply_1000方法,将4个步骤合并为一步,通过一次扫描得到结果。

public long get_long_efficiently_and_multiply_1000(byte[] src, final int index)    {        long multiplicand = 3;         long result =0;        Field field = getFields()[index];        boolean in_decimal_part = false;        boolean negative = false;        int offset = field.getOffset();        int length = field.getLength();        int end = offset+length;        for(int i =field.getOffset(); i< end; i++)        {            byte ch = src[i];                        if(ch>=48 && ch<=57) //如果是数字            {                result *= 10;                result += ch-48;                if(in_decimal_part)                    multiplicand--;                if(multiplicand==0) break;                continue;            }                        if(ch==32) //如果是空格                continue;                        if(ch == 46) //如果是小数点            {                in_decimal_part = true;                
TAG:
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线------
栏目列表
推荐内容