歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> 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.htm

Java 8簡明教程 http://www.linuxidc.com/Linux/2014-03/98754.htm

Java對象初始化順序的簡單驗證 http://www.linuxidc.com/Linux/2014-02/96220.htm

Java對象值傳遞和對象傳遞的總結 http://www.linuxidc.com/Linux/2012-12/76692.htm

Java對象序列化ObjectOutputStream和ObjectInputStream示例 http://www.linuxidc.com/Linux/2012-08/68360.htm

--------------------------------------分割線 --------------------------------------

1.2系統環境

1.2.1硬件環境

Server類型

虛擬機

CPU

1核,Intel(R) Xeon(R) CPU E5603 @ 1.60GHz

內存

3GB

1.2.2軟件環境

操作系統

Windows XP Pro Version 2002 SP3

Tomcat

apache-tomcat-7.0.47-windows-x86

JDK

jdk1.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 start

104s

使用RunTime,加cmd /c start,內存為64M

85s

使用RunTime,加cmd /c start,內存加大到512M

85s

使用processBuilder,不加cmd /c start

88s

使用processBuilder,加cmd /c start

87s

使用processBuilder,加cmd /c

87s

 

優化後,運行時間提升幅度為(104-85)/104*100%=18.27%。

1.3.3屏蔽輸出

直接執行,輸出信息

80s

直接執行,不輸出信息

72s

 

優化後,運行時間提升幅度為(80-72)/80*100%=10%。

1.3.4CPU優化

1核2.4GHz

292s

4核2.5GHz

69s

 

優化後,運行時間提升幅度為(292-69)/292*100%=76.37%。

1.3.5Java Runtime優化

在Java程序中使用Runtime執行操作系統命令的時候,發現java程序的CPU占用率高達66%,而執行的命令程序只占33%,因此需要考慮優化Runtime方法的執行。

優化方法:將執行命令的方法中啟動的兩個用於讀取輸出和錯誤流的線程去掉,改為直接讀取這兩個流,而不是啟動2個線程。

優化前後對比如下:

測試項

優化前

優化後

Linux

直接在cmd中執行耗時

347s

344s

在Java中使用Runtime執行耗時

728s

353s

CPU占用率

ffmpeg:33%

Javaw:66%

ffmpeg:66%

Javaw:33%

Windows

直接在cmd中執行耗時

87s

86s

在Java中使用Runtime執行耗時

107s

88s

CPU占用率

ffmpeg:20%

Javaw:40%

ffmpeg:40%

Javaw:0%

 

優化後,運行時間提升到和直接執行命令相當的水平。

2優化過程

搭建測試環境

記錄命令行上的執行時間;

記錄Java程序中的執行時間;

按照優化點分析進行優化,分別記錄優化之後的執行時間;

生成優化報告,並記錄詳細的優化步驟,供後續使用。

2.1搭建測試環境

1)搭建人臉識別的運行環境。

2)由於人臉識別步驟耗時較長,為了便於快速進行優化測試,准備一個24秒長的電影片段,總共包含4個人臉,並且每一幀都會有至少一個人臉。

2.2在命令行中執行

在CMD中執行下面的命令,以手動啟動人臉檢測步驟。

C:\Face.bat Y:\FaceRecognition\DispatcherMovies\face.avi

記錄命令執行前後的時間如下:

The current time is: 18:11:04.52

The 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:15

The 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:23

The current time is: 14:50:18

總計執行1375秒。

2.4.2屏蔽輸出

將人臉識別bat文件中輸出全部屏蔽掉,在bat文件中每個命令的後面加上“> nul”參數。

記錄命令執行前後的時間如下:

The current time is: 15:17:09

The 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:55

The current time is: 22:00:38

總計執行523秒。

既增加CPU數量,又增加CPU主頻

將原來的1核CPU擴展到32核CPU。CPU配置由1.60GHz變為2.13GHz。

記錄命令執行前後的時間如下:

The current time is: 10:35:07

The current time is: 10:41:21

總計執行374秒。

2.4.4Java Runtime優化

優化前後對比如下:

測試項

優化前

優化後

直接在cmd中執行

245s

245s

在Java中使用Runtime執行

374s

239s

 

優化後,運行時間提升到和直接執行命令相當的水平。

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-07/104412p2.htm

Copyright © Linux教程網 All Rights Reserved