併發編程學習(12)-----併發性能的測試

思維導圖:

引言:

    本文的主要內容是介紹如何測試併發程序。因爲全是都只是對併發程序的測試的簡要描述,所以基本上都歸屬於理論部分。

  • 理論部分:包括正確性測試,性能測試,和其他測試

一.正確性測試

    對於併發程序來說,我們應該首先保證其正確性,即能夠正確運行並獲得正確的結果。那麼,如何保證併發程序的正確性呢?我們可以從需要檢查的不變性條件和後驗條件入手,並從以下幾個方面進行分析。

  1. 串行邏輯測試:在單線程的環境下進行測試,保證代碼的基本運行良好。
  2. 阻塞測試:某些操作可能會涉及到阻塞,我們可以創建一個可以使併發程序阻塞的線程,然後觀察其是否阻塞的結果。
  3. 安全性測試:統計出需要進行檢查的不變性條件和後驗條件,然後通過一個校驗函授或其他方式進行校驗。
  4. 資源管理測試:使用商業的或者開源的堆分析工具,檢驗併發程序是否不合理的使用了內存。
  5. 回調測試:在對象已知的某個生命週期判斷其不變性條件是否被破壞。
  6. 交替性測試:很多錯誤都是在線程交替時出現的,所以,我們可以產生更多的線程交替操作以進行這種測試。

二.性能測試

    在保證了程序的正確性後,我們就可以對程序的性能進行測試了。性能測試的目標就是根據測試的結果調整各種不同的限值,以使併發程序獲得最好的性能。

2.1 性能測試的方式

    我們可以通過以下幾種方式對性能進行測試和衡量:

  • 添加計時功能:通過對併發程序添加計時功能已衡量其性能
  • 多種算法比較:同時對比使用多種算法的耗時結果以選擇最好的實現算法
  • 響應性衡量:通過統計每個線程的完成時間以衡量併發程序的吞吐量和響應性

2.2 性能測試的陷阱

    進行性能測試有一些常見的陷阱,如下所示:

  • 垃圾回收:因爲垃圾回收無法預測,並會對測試結果造成影響,所以在測試期間,要麼沒有垃圾回收,要麼執行多次回收。
  • 動態編譯:當某個方法運行的次數足夠多時,JVM會將字節碼直接編譯爲機器碼以提高運行速度,這個時機是不可空的,並且會對測試結果造成顯著的影響。爲了避免這個情況,我們可以在運行幾分鐘後進行性能測試。
  • 對代碼路徑的不真實採樣:JVM會通過執行過程中特定的信息來優化代碼,所以,同一個方法,在不同的程序中的編譯結果可能是不同的。所以,測試時,我們需要儘量覆蓋我們需要執行的代碼路徑,並且將單線程和多線程的性能測試結果在一起。
  • 不真實的競爭程度:要獲得有實際意義的測試結果,就需要模擬最接近正式環境的併發量和競爭程度。
  • 無用代碼的消除:JVM編譯時會自動消除某些不會對輸出結果產生任何影響的代碼。由於基準測試通常不會執行任何運算,所以很容易被編譯器消除,我們可以通過打印某些信息或者其他方式以防止基準測試的代碼被消除。

三.其他的測試方法

    還有一些其他的方法幫我我們找出併發程序可能出現的錯誤,簡要如下所示:

  • 代碼審查:通過多人對代碼進行代碼審查,可以最大限度的發現安全性性錯誤和其他錯誤。
  • 靜態分析工具:利用一些靜態的代碼分析工具,在編譯期之前就發現可能出現的問題。
  • 面向切面技術:利用面向切面技術保證不變性條件不被破壞。
  • 分析與檢測工具:利用商業分析工具對併發程序進行分析和鑑定。

 

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章