考古学家新手上路修Bug--Jxl工具优化导出速度

873 阅读4分钟

工作场景

实习培训后第一个修bug任务。

项目具体的场景:在考勤页面的按钮,功能是导出一个考勤的Excel表格,但是在在无标题页面,停滞时间过长(6s)左右极大的影响用户的使用体验感。

解决过程

定位问题出现的位置

用前端定位后端代码方法的位置

如果页面是使用HTML编写,我们就可以在浏览器的开发者模式下找到这个按钮调用的函数,然后再项目中搜索这个函数,通过这个函数找到后端被调用的方法。

如果项目使用有些时间了如果是jsp页面就比较难定位,我是直接查方法名称,再IDEA定位到相关位置。 查到了相关方法后先打个断点。大概粗略浏览一遍注释和代码,如果没有什么注释就,先大致看看代码。

使用日志来测算方法中代码的执行时间

使用debug日志输出信息(提前设置好日志输入的内容-最后时间精度高点,方便查看代码的性能)来把方法分几段,然后直接运行我们需要调试的方法(这里就不用开启debug模式,debug模式会对性能产生影响导致测算出的数据不准确)

当遇到方法比较长的时候,我们可以多输出几个debug日志来确定它们的时间开销--下面是例子

image.png

运行后的效果-(包名被我涂掉了)

image.png

只需要几次尝试大致就能定位出时间开销比较大的地方,就比如test1到test2输出信息相差5s,对于一共文件导出功能来说,这太漫长了。我们就可以在test1到test2的debug信息之间多开几个debug日志输出,查查看究竟是哪一条语句运行时间有问题?

image.png 运行,调用功能并且查看日志

image.png 就定位到workbook.createWorkbook()这个方法时间开销最大,我们就进入这个方法详细的查看

如果方法是没有被封装的,就可以进一步调试修改。我面对的这个方法是一个封装好的类-(不是公司自研)

定位到代码后,如何进行对问题的初步了解

先了解问题-what,where,why,how

  1. 是什么,这个问题是什么:方法是干什么的?
  2. 哪里来的,了解这个方法的引用来源,是自研还是网上开源
  3. 为什么要使用它,有没有代替方案(一般当作plan B)
  4. 怎么去对它进行修改操作

首先,我查到这是一个比较知名的轻量级excel导出类的jar包-jxl 代替方案暂时pass,它本来就代替了另一个比较知名的POI工具 查到了jxl性能读取在1s内(对我当前业务数据估算)

image.png 这就问题来了,为什么方法的时间开销是5s,这明显不符合网络上的数据。

我们就直接查找jxl有什么优化方法-使用搜索引擎- 获得---相关文章jxl操作导出慢(看了并不是只有我遇到的问题-这样就好解决了) 当然我们要先去多看看文章,切记不要只看一篇文章就马上进行操作(因为不是对这个内容比较熟悉),最好多看看别人写的文章,看看有没有共同性。如果没有我们就要慢慢搜查,要找到文章中对应自己实际场景配置的地方,或是已经看了挺多文章自己大致了解个大概。可以去官方文档查查是不是这个问题。

(符合我当前项目的场景)现在查的原因就是jxl在执行读写操作时进行了多次的gc(jvm垃圾回收)占用了大量的时间。找到可能的问题原因后,可以自己分析来验证问题,简单验证方法就是用main方法运行业务代码和用tomcat运行业务代码对比差距。

这样我们大致可能找到了问题的原因,我们就可以去找网络上的解决方法。

发现里面有单次sheet时有3个gc的代码

image.png image.png image.png 目前找到的方法是关闭自带的设定,关闭里面的手工gc垃圾回收

image.png 目标就是让gcDisable==true不执行这三个gc操作就能加快运行时间

修改前

image.png

修改后--上面是新增的 image.png

只能说维护这样的老项目就像在考古,实习重点学的还是解决问题的思路吧,这个例子也不怎么样,比较不算是自己完完全全自己独立解决,一次争取自己独立解决这类的问题。