多线程+NIO优化代码,批次处理时间从50s优化到10s

本文讲述了作者在处理新能源光伏项目财务测算时,通过优化多线程、使用NIO、管理和维护数据库热点数据,显著提高了计算效率的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景介绍

今年5月份 也就是2023年5月,新接手了一个小项目,是关于财务测算,其实就是计算得出财务几大报表和关键指标,通过分析指标数据判断项目是否具有投资价值,业务领域是新能源 光伏方面的,
我对于金钱方面的业务是比较头疼的,虽然不涉及金钱交易,但是牵扯到钱的概念,我都生怕那里搞错了 喜提 缝纫机锻炼包吃包住套餐,绝对不刑!
财务方面的算法发面是由公司财务的同事提供,我这边负责具体实现,另外由于财务方面的数据的正确性要求非常严格,公司的另一个写R语言开发的同事 也同时进行开发,后面我们再比对计算结果,这样才能保证计算逻辑的正确性,写R的同事 前端是采用excel开发,而我是和公司OA的同事配合,从飞书里面请求后台接口。(ps: 当我看到写R的同事 各种花式操作excel的时候 我都惊呆了,原来excel还能这么玩,excel 文件后缀名改成 .zip 后,打开压缩包,会发现有惊喜,可以进行VB魔法语言的开发工作)
起初我也没考虑到效率方面的问题,毕竟财务的业务也不是经常用,而且那里来的这么多项目需要进行财务测算,就这样大概到了7月初,开发工作基本完成了,我和那个写R的同事 好不容易 最终数据能对的上了。
至于效率方面,这个测算分为两种模式,一种是单次测算,一次请求后台算一次,最终导出一份报表;另外一种是 批次测算,这种模式下需要调整三个参数,每个参数有五个幅度值,这样的话,批次测算在后台会算555=125次, 在7月初刚开发完的时候 我和那个R的同事对比了一下效率,他那边执行完要大概3分钟左右,我大概1分钟结束了,领导说 可以接受,然后中间就基本没怎么管过这个事情了,直到最近,先来无事,想着看看手头上的项目,看看有哪里可以优化的地方。

优化项

1、多线程
刚开始开发的时候没有采用多线程,当时开发的时候主要遇到两个问题,一个是全局的自定义缓存对象 的浅拷贝问题,另外一个就是导出报表的时候 多线程会导致模板被锁住的问题,这样一来 多线程的优势 就体现不出来了,现在一想当时脑子真是被驴踢了, 模板被锁住的问题,其实也很好解决, 多线程每个线程在开始的时候每个线程都先复制一份模板,这样就不存在模板被锁住的问题了,算完后 再把该线程对应的模板给删掉就好了。加入多线程后,批次测算从最初的50s左右减少到了20多s。
2、NIO
后来再一想,在每个线程复制模板的时候采用NIO的方式去复制会不会更快呢,于是更改为NIO的方式。
改完后发现减少到了十几秒,而且如果中间长时间不发起测算,后面的第一次测算发现会比平常慢个几秒钟。
java的 NIO为什么能提高效率,说白了还是操作系统层面 通过不同的方式来减少 用户态和内核态的切换次数和数据的拷贝次数,避免两种形态的切换时导致的开销和拷贝数据时的开销。原理可参考 零拷贝
3、数据库存储引擎内存的热点数据方面
这个项目的数据库是oracle,而且数据库是公司OA同事部署的,这里想了下2里面的问题,长时间不请求的时候再次访问,会比平常慢个几秒钟,我想起来mysql 的buffer pool 的热点数据的有效性,这里我网上大概看了下oracle,关于这方面都类似,长时间不被访问,会被移出 热点数据区域,下次访问就需要从磁盘加载到内存了,这样一来肯定就慢了啊,所以我加了个定时任务,每隔30分钟去用模拟参数调用下后台的接口,保持热点数据一直在内存中。
关于buffer pool 可以参考buffer pool
数据库oracle不怎么用,而且好久没用过了,mysql的话,新手我推荐 << 从根上理解mysql>>,对于存储层 解释的很细,而且容易理解,进阶的话可以参考 <<高性能mysql >>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值