天天看點

Lab53.1 Static Program Analysis3.2 Java I/O Optimization

Lab5總結

  • 3.1 Static Program Analysis
    • 3.1.1 人工代碼走查(walk through)
    • 3.1.2 使用CheckStyle和SpotBugs進行靜态代碼分析
  • 3.2 Java I/O Optimization
    • 3.2.1 新功能:持久化存儲
    • 3.2.2 多種I/O實作方式
    • 3.2.3 多種I/O實作方式的效率對比分析

3.1 Static Program Analysis

針對 Lab4 中送出的最新版本代碼,進行靜态代碼分析。

3.1.1 人工代碼走查(walk through)

列出你所發現的問題和所做的修改。每種類型的問題隻需列出一個示例即可。

之前寫條件判斷if和else時,如果隻有一條語句,沒有加花括号,例如:

Lab53.1 Static Program Analysis3.2 Java I/O Optimization

checkRep、構造方法和main方法沒有寫javadoc,有點想當然了。

對于泛型類的equals重寫:一開始注明了具體的泛型類,會産生unchecked cast的warning。修改如下:

Lab53.1 Static Program Analysis3.2 Java I/O Optimization

3.1.2 使用CheckStyle和SpotBugs進行靜态代碼分析

列出你所發現的問題和所做的修改。每種類型的問題隻需列出一個示例即可。

對比分析兩種工具發現問題的能力和發現問題的類型上有何差異。

CheckStyle很好地發現了不符合google規範的代碼(人工走查時沒有發現),例如将多個變量定義在一起:

Lab53.1 Static Program Analysis3.2 Java I/O Optimization

SpotBugs找出代碼邏輯上存在的bug,例如我在使用bufferedreader的readline方法時沒有考慮讀入為空的情況:

Lab53.1 Static Program Analysis3.2 Java I/O Optimization

SpotBugs會給出對于該bug的可能性(目前隻見過high confidence和normal confidence)

兩種工具都是旨在找出代碼中的問題,不同之處在于:CheckStyle關注的是代碼的結構問題,不修改不會影響程式的運作,但會降低代碼的可讀性;而SpotBugs旨在找出代碼中的漏洞,不修改可能會引起程式的崩潰。

3.2 Java I/O Optimization

3.2.1 新功能:持久化存儲

首先在TrackGame添加方法save,然後在用戶端Main.java中增加一個功能:将目前的circularOrbit修改過後存入新的檔案client.output中。目錄結構如下:

Lab53.1 Static Program Analysis3.2 Java I/O Optimization

3.2.2 多種I/O實作方式

實作了哪些I/O方式來讀寫檔案,具體如何實作的。

讀檔案采用的三種分别是BufferedReader、FileInputStream和Scanner;寫檔案采用的三種分别是BufferedWriter、FileOutputStream和FileWriter。具體時間大體相同,目錄結構如下:

Lab53.1 Static Program Analysis3.2 Java I/O Optimization

如何用strategy設計模式實作在多種I/O政策之間的切換。

為三種政策定義相同的interface,在具體應用中的readFileAndBuild方法中添加了一個參數InputStrategy,根據不同的參數切換不同的政策(同理OutputStrategy)。

p.s. 在三個具體應用中分别使用了三種不同的InputStrategy和OutputStrategy以證明其正确性。

3.2.3 多種I/O實作方式的效率對比分析

采用的測試檔案為老師提供的50萬行左右的TrackGame.txt和90萬行左右的SocialNetworkCircle.txt。為了測試友善沒有在用戶端Main中測試,而是編寫了兩個測試檔案:TrackGameTest和SocialNetworkCircleTest。剛開始設計時沒有建立軌道系統對象,隻是根據幾個Strategy單純測量了一下IO時間;後來又按行讀入解析檔案,是以讀檔案的時間變成了讀取檔案+構造系統的時間。

如何收集你的程式I/O文法檔案的時間。

在調用readFileAndBuild和save方法前後通過system.currentTimeMillis方法擷取時間并作內插補點,得到IO所消耗的時間。

表格方式對比不同I/O的性能。

Lab53.1 Static Program Analysis3.2 Java I/O Optimization

圖形對比不同I/O的性能。

純IO:

Lab53.1 Static Program Analysis3.2 Java I/O Optimization
Lab53.1 Static Program Analysis3.2 Java I/O Optimization

通過軌道系統對象測量的IO:

Lab53.1 Static Program Analysis3.2 Java I/O Optimization