设为首页 加入收藏

TOP

一次Java调用OS命令的优化过程实录
2014-11-23 22:10:00 来源: 作者: 【 】 浏览:21
Tags:一次 Java 调用 命令 优化 过程 实录

人脸识别(FaceRecognition)服务运行在Windows系统的bat文件中,其计算量非常大,运行耗时也比较长(10-20小时),并且在Java程序中使用Runtime执行命令,比直接运行cmd命令耗时更多,因此必须采取必要的手段对整个Server进行优化。


主要优化目标是降低Java程序中的执行时间,以提高吞吐率。



--------------------------------------分割线 --------------------------------------








--------------------------------------分割线 --------------------------------------


下面,搭建模拟环境,分析潜在的优化点。


加内存,catalina.bat中加上Java VM参数:


下面是Tomcat添加JVM参数之后的对比结果(测试ffmpeg命令):


可见,优化内存,基本无效。


仍然采用上面的测试例子,不同方法的执行时间对比如下:



优化后,运行时间提升幅度为(104-85/104*100%=18.27%



优化后,运行时间提升幅度为(80-72/80*100%=10%



优化后,运行时间提升幅度为(292-69/292*100%=76.37%


Java程序中使用Runtime执行操作系统命令的时候,发现java程序的CPU占用率高达66%,而执行的命令程序只占33%,因此需要考虑优化Runtime方法的执行。


优化方法:将执行命令的方法中启动的两个用于读取输出和错误流的线程去掉,改为直接读取这两个流,而不是启动2个线程。


优化前后对比如下:



优化后,运行时间提升到和直接执行命令相当的水平。


*搭建测试环境


*记录命令行上的执行时间;


*记录Java程序中的执行时间;


*按照优化点分析进行优化,分别记录优化之后的执行时间;


*生成优化报告,并记录详细的优化步骤,供后续使用。


1)搭建人脸识别的运行环境。


2)由于人脸识别步骤耗时较长,为了便于快速进行优化测试,准备一个24秒长的电影片段,总共包含4个人脸,并且每一帧都会有至少一个人脸。


CMD中执行下面的命令,以手动启动人脸检测步骤。


记录命令执行前后的时间如下:


总计执行504秒。


Java程序中采用“Runtime.getRuntime().exec(cmd)”的方式执行Windows操作系统的DOS命令,其中命令前面加上“cmd /c start”参数,以提高执行效率。


记录命令执行前后的时间如下:


总计执行1617秒。


将默认的64M内存加大为1024M。在catalina.bat中加上Java VM参数:


记录命令执行前后的时间如下:


总计执行1375秒。


将人脸识别bat文件中输出全部屏蔽掉,在bat文件中每个命令的后面加上“> nul”参数。


记录命令执行前后的时间如下:


总计执行1326秒。


*只增加CPU数量,不增加CPU主频


将原来的1CPU扩展到8CPUCPU配置为:Intel(R) Xeon(R) CPU E5603 @ 1.60GHz


记录命令执行前后的时间如下:


总计执行523秒。


*既增加CPU数量,又增加CPU主频


将原来的1CPU扩展到32CPUCPU配置由1.60GHz变为2.13GHz


记录命令执行前后的时间如下:


总计执行374秒。


优化前后对比如下:



优化后,运行时间提升到和直接执行命令相当的水平。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Hibernate整体理解 下一篇对两个奇葩的C语言程序的思考

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: