Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / 一次Java调用OS命令的优化过程实录

1前言

1.1优化目标

人脸识别(FaceRecognition)服务运行在Windows系统的bat文件中,其计算量非常大,运行耗时也比较长(10-20小时),并且在Java程序中使用Runtime执行命令,比直接运行cmd命令耗时更多,因此必须采取必要的手段对整个Server进行优化。主要优化目标是降低Java程序中的执行时间,以提高吞吐率。--------------------------------------分割线 --------------------------------------编写高质量代码 改善Java程序的151个建议 PDF高清完整版 http://www.linuxidc.com/Linux/2014-06/103388.htmJava 8简明教程 http://www.linuxidc.com/Linux/2014-03/98754.htmJava对象初始化顺序的简单验证 http://www.linuxidc.com/Linux/2014-02/96220.htmJava对象值传递和对象传递的总结 http://www.linuxidc.com/Linux/2012-12/76692.htmJava对象序列化ObjectOutputStream和ObjectInputStream示例 http://www.linuxidc.com/Linux/2012-08/68360.htm--------------------------------------分割线 --------------------------------------

1.2系统环境

1.2.1硬件环境

Server类型虚拟机
CPU1核,Intel(R) Xeon(R) CPU E5603 @ 1.60GHz
内存3GB

1.2.2软件环境

操作系统Windows XP Pro Version 2002 SP3
Tomcatapache-tomcat-7.0.47-windows-x86
JDKjdk1.7.0_04

1.3潜在优化点分析

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

1.3.1加大Java VM内存

加内存,catalina.bat中加上Java VM参数:
set JAVA_OPTS=-Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256m
下面是Tomcat添加JVM参数之后的对比结果(测试ffmpeg命令):
默认内存(64M)85 s
加大内存(1024M)85 s
可见,优化内存,基本无效。

1.3.2优化执行命令的Java方法

仍然采用上面的测试例子,不同方法的执行时间对比如下:
命令行中直接执行bat文件69s
使用RunTime,不加cmd /c start104s
使用RunTime,加cmd /c start,内存为64M85s
使用RunTime,加cmd /c start,内存加大到512M85s
使用processBuilder,不加cmd /c start88s
使用processBuilder,加cmd /c start87s
使用processBuilder,加cmd /c87s
 优化后,运行时间提升幅度为(104-85)/104*100%=18.27%。

1.3.3屏蔽输出

直接执行,输出信息80s
直接执行,不输出信息72s
 优化后,运行时间提升幅度为(80-72)/80*100%=10%。

1.3.4CPU优化

1核2.4GHz292s
4核2.5GHz69s
 优化后,运行时间提升幅度为(292-69)/292*100%=76.37%。

1.3.5Java Runtime优化

在Java程序中使用Runtime执行操作系统命令的时候,发现java程序的CPU占用率高达66%,而执行的命令程序只占33%,因此需要考虑优化Runtime方法的执行。优化方法:将执行命令的方法中启动的两个用于读取输出和错误流的线程去掉,改为直接读取这两个流,而不是启动2个线程。优化前后对比如下:
测试项优化前优化后
Linux直接在cmd中执行耗时347s344s
在Java中使用Runtime执行耗时728s353s
CPU占用率ffmpeg:33%Javaw:66%ffmpeg:66%Javaw:33%
Windows直接在cmd中执行耗时87s86s
在Java中使用Runtime执行耗时107s88s
CPU占用率ffmpeg:20%Javaw:40%ffmpeg:40%Javaw:0%
 优化后,运行时间提升到和直接执行命令相当的水平。

2优化过程

搭建测试环境记录命令行上的执行时间;记录Java程序中的执行时间;按照优化点分析进行优化,分别记录优化之后的执行时间;生成优化报告,并记录详细的优化步骤,供后续使用。

2.1搭建测试环境

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

2.2在命令行中执行

在CMD中执行下面的命令,以手动启动人脸检测步骤。
C:Face.bat Y:FaceRecognitionDispatcherMoviesface.avi
记录命令执行前后的时间如下:
The current time is: 18:11:04.52The current time is: 18:19:29.09
总计执行504秒。

2.3在Java程序中执行

Java程序中采用“Runtime.getRuntime().exec(cmd)”的方式执行Windows操作系统的DOS命令,其中命令前面加上“cmd /c start”参数,以提高执行效率。记录命令执行前后的时间如下:
The current time is: 13:54:15The current time is: 14:21:12
总计执行1617秒。

2.4性能优化

2.4.1内存优化

将默认的64M内存加大为1024M。在catalina.bat中加上Java VM参数:
set JAVA_OPTS=-Xms1024m -Xmx1024m -XX:PermSize=128M -XX:MaxPermSize=256m
记录命令执行前后的时间如下:
The current time is: 14:27:23The current time is: 14:50:18
总计执行1375秒。

2.4.2屏蔽输出

将人脸识别bat文件中输出全部屏蔽掉,在bat文件中每个命令的后面加上“> nul”参数。记录命令执行前后的时间如下:
The current time is: 15:17:09The current time is: 15:39:15
总计执行1326秒。

2.4.3CPU优化

只增加CPU数量,不增加CPU主频将原来的1核CPU扩展到8核CPU。CPU配置为:Intel(R) Xeon(R) CPU E5603 @ 1.60GHz。记录命令执行前后的时间如下:
The current time is: 21:51:55The current time is: 22:00:38
总计执行523秒。既增加CPU数量,又增加CPU主频将原来的1核CPU扩展到32核CPU。CPU配置由1.60GHz变为2.13GHz。记录命令执行前后的时间如下:
The current time is: 10:35:07The current time is: 10:41:21
总计执行374秒。

2.4.4Java Runtime优化

优化前后对比如下:
测试项优化前优化后
直接在cmd中执行245s245s
在Java中使用Runtime执行374s239s
 优化后,运行时间提升到和直接执行命令相当的水平。更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2014-07/104412p2.htm