机柜侧面的接口盖板还掀着,陈帆蹲在地上,手指正捏住一条灰网线的水晶头,对准ISDN终端盒的插槽轻轻推入。线路另一端连着刚装好的BRI接口卡,驱动光盘还摊在桌角,说明书被翻到了“多链路绑定配置”那一页。
林悦站在他身后半步的位置,目光扫过终端盒上跳动的指示灯。“绿灯常亮,黄灯闪烁,说明物理层已经通了。”她的声音不高,但清晰。
陈帆没回头,只点了下头,伸手打开主机电源。系统启动后,他立刻切入设备管理器,却发现网络适配器列表里只识别出一个通道。他皱了下眉,调出注册表编辑器,找到通信端口的配置项,手动将“NumberOfChannels”从1改为2,又在协议栈中强制启用PPP多链路聚合。
“再试一次。”
重启后,双通道终于全部激活。屏幕上的网络状态显示:连接速率128Kbps,全双工模式。
“数据流能接上了。”他说,语气平得像在报读仪表数值。
他切换到测试程序界面,开始接收深交所的实时行情推送。前五秒一切正常,每秒稳定传回18条报价数据。可到了第十秒,接收队列突然停滞,时间戳出现断层,紧接着连续三组数据包丢失。
“缓冲区溢出。”林悦看了眼日志,“老结构撑不住这个速度。”
原用的单线程轮询机制是按56K拨号环境设计的,每次取数间隔固定为200毫秒。现在数据洪流以每秒20条的速度涌入,旧逻辑根本来不及处理,导致新包覆盖旧包,内存队列崩溃。
陈帆关闭测试进程,打开底层接收模块的源码。他把原本的同步阻塞式读取,改成基于事件触发的异步非阻塞模式,同时在内存中开辟一块环形缓冲区,容量扩大至原先的四倍。新机制下,数据写入和读取分离,不再互相阻塞。
“重来。”
程序再次运行,绿色进度条平稳爬升。屏幕上逐行刷新着接收到的行情记录:时间、代码、最新价、成交量……连续五分钟未出现丢包。
“稳住了。”他说。
林悦低头看了眼自己的掌上电脑,远程监控界面显示数据延迟已从之前的30秒降至18秒。她抬眼:“还能压。”
陈帆没答话,而是调出预测引擎的核心调度模块。当前的计算流程是按周期批处理的——每30秒统一抓取一次数据,然后启动分析模型。这种节奏在低速环境下尚可接受,但在128Kbps的专线支持下,明显成了瓶颈。
他新建了一个后台服务进程,命名为“Predictor_Realtime”。在这个新进程中,预测算法不再等待整批数据,而是采用事件驱动方式:一旦接收到新的行情包,立即提取关键字段,对价格趋势做局部重算,并更新输出结果。
“现在,它会随时反应。”他敲下最后一行代码,按下编译。
系统重新加载模块,主界面的预测曲线开始以更密集的频率跳动。每一笔成交价变动后,虚线轨迹平均在7秒内完成修正。
林悦盯着屏幕角落的时间差标注:输入时间 10:23:41.2,输出时间 10:23:48.1。延迟压缩到了7秒。
“够快了。”她说。
“还不够。”陈帆调出图形渲染层代码,“人眼看到的,才是真实的响应速度。”
前端页面仍用的是早期ASP框架,每次刷新都要重新生成整个图表,耗时严重。他在客户端加入一层轻量级缓存,预先加载最近5秒的价格趋势,在本地模拟出动态延伸效果。虽然实际计算仍在后台进行,但视觉上已接近实时追踪。
项目负责人上午十一点赶到实验室。他没带其他人,手里拎着一份打印的测试计划表。
“我听说你们换了专线?”他站到主控台前,目光落在显示器上不断跳动的曲线。
“刚通。”陈帆调出实时监控面板,“目前每秒接收20条数据,预测延迟控制在10秒以内。”
负责人眯起眼:“比卫星行情快?”
“传统卫星推送有编码、上行、转发、解码四道环节,端到端延迟普遍在15秒以上。”林悦在一旁补充,“我们直连交易所前置机,路径更短。”
负责人没说话,只是盯着“陆家嘴”的模拟交易窗口。系统刚刚发出买入信号——早盘量能突增,价格突破昨日高点,委托买盘持续加码。信号发出后第9秒,股价开始拉升。
“试试压力情况。”
陈帆启动全速测试,将过去一周的高频波动行情导入模拟环境。系统开始连续接收密集数据流,预测模块高频响应。
运行到第三分钟,异常出现了。
一条来自某营业部的错误报单混入数据流:一笔“陆家嘴”的成交价被录为**999.99元**,瞬间拉高均价。预测曲线剧烈上扬,几乎触达自动止损阈值。
“要爆了!”负责人脱口而出。
陈帆迅速调出过滤规则模板,参考林悦之前整理的手册内容,在数据预处理层插入标准差校验逻辑:任何偏离过去一分钟均值三个σ以上的数值,自动标记为异常并剔除。
程序重新运行,那条千位级报价被精准拦截。预测曲线恢复平稳,仅在数据抖动瞬间出现轻微波动,随即回归正常轨道。
“这招管用。”负责人松了口气。
接下来的72小时,系统以全速状态持续运行模拟交易。标的锁定“陆家嘴”,策略基于量价共振原理:当成交量突增超过前一时段均值两倍,且价格站稳分时均线之上时建仓;卖出条件设定为涨幅趋缓、卖一档挂单量突然放大。
三日后,账户虚拟资金从100万增长至118万,复合收益率18%,最大回撤不足4%。
“比上次高了六个百分点。”负责人看着收益曲线,语气里多了些认可,“响应速度确实压下去了。”
“专线带来的不只是带宽。”陈帆指着后台日志,“是整个数据闭环的重构。从前我们追着市场跑,现在至少能踩准它的呼吸节奏。”
负责人点点头,临走前留下一句话:“下周科委评审会,把这个测试结果带上。”
门关上后,实验室恢复安静。服务器风扇低鸣,指示灯规律闪烁。
林悦看了眼时间,将近下午五点。她没动,只是问:“下一步?”
“多线程预测。”陈帆已经打开了新项目文件,“不能只盯一只股票。十个,二十个,同时推演。”
他新建了一个类库,命名为“MultiPredictor_Core”。界面还没搭好,只有命令行窗口跳出一行提示:
> 初始化成功。支持并发实例数:8。
林悦看了一会儿代码结构,忽然说:“如果同时跑太多,内存怕是扛不住。”
“那就拆。”他说,“每个进程独立分配资源,失败也不影响整体。”
她点头,顺手把自己的掌上电脑连上调试端口,开启远程日志监听。屏幕右下角跳出一个绿色小标,显示“协作者在线”。
陈帆继续敲击键盘,函数名一个个列出来:StartNewThread、SyncWithDataSource、PushToCache……
突然,主屏幕弹出一条警报:
> 警告:内存占用已达87%,建议释放非核心进程。
他扫了一眼任务管理器,发现是刚才的测试残留进程未完全关闭。他手动终止两个旧线程,重新启动调度器。
绿色曲线再次浮现,这次是两条平行的趋势预测线,分别对应“陆家嘴”和“深发展”。
“能跑。”他说。
林悦盯着那两条逐渐分离的轨迹,轻声问:“你打算让系统看多远?”
陈帆停下敲字的手,看了眼窗外。暮色已经漫上来,玻璃映出房间里的冷光。
“不是我看多远。”他说,“是它能不能自己找到下一个信号。”