讀古今文學網 > Java程序員修煉之道 > 6.2 務實的性能分析法 >

6.2 務實的性能分析法

許多開發人員在接到性能分析任務時,腦子裡都不清楚他們要通過分析得到什麼。所有開發人員或經理在開始做這件事時經常只是模模糊糊地感覺代碼「應該跑得更快」。

但這是徹底的倒退。要進行真正有效的性能調優,在開始做任何技術類工作之前,你應該先認真考慮下面這些問題並找出答案。

  • 你正在測量的代碼有哪些可觀測的環節?
  • 如何測量那些可觀測環節?
  • 這些可觀測環節的目標是什麼?
  • 你怎麼判斷性能調優是否做好了?
  • 性能調優可接受的最大支出是多少(按開發人員投入的時間和增加的代碼複雜度計算)?
  • 在優化的過程中,哪些東西是你不能捨棄的?

最重要的,也是我們要反覆強調的,就是你必須測量。你至少得測量一個可觀測環節,才算得上是在做性能分析。

當你開始測量代碼,便經常會發現事情並非你想的那樣。很多性能問題的根源可能是一個丟失的數據庫索引,或者有爭議的文件系統鎖。在優化代碼時,你應該時刻牢記代碼很可能不是問題的關鍵。為了定量分析問題,你首先需要知道自己在測量什麼。

6.2.1 知道你在測量什麼

做性能調優必須測量一些東西。如果你沒有測量可觀測環節,就不能算做性能調優。坐在那裡盯著代碼,希望腦子裡蹦出一個可以更快解決問題的方法,這可不是性能分析。

提示 要成為優秀的性能工程師,你必須知道平均數、中位數、模式、方差、百分位數、標準差、樣本大小、正態分佈等這樣一些術語。如果還不熟悉這些概念,最好現在就到網上搜搜,如果有必要的話,認真看看搜出來的內容。

做性能分析最重要的是知道哪個可觀測環節(上節介紹的)最重要。你應該總是把測量結果、目標和結論跟一個或多個基本可觀測環節結合起來。

這裡有些常見的可觀測項,都是性能調優的好對象。

  • 方法handleRequest運行所需的平均時間(啟動完成之後)。
  • 並發客戶端數量為10時,系統等待時間的第90個百分位數。
  • 把並發用戶數從1增長到1000時,響應時間的退化。

以上這些都是工程師想要測量的代表性數值,並很有可能需要優化。想得到準確又有用的數值,必須掌握基本的統計學知識。

知道你要測量什麼,對數值的準確性有信心是性能調優的第一步。但模糊或隨意的目標通常沒什麼好結果,性能調優也是如此。

6.2.2 知道怎麼測量

要精確確定一個方法或其他代碼片段運行需要多長時間,只有兩種方法:

  • 直接測量,在類源碼中插入測量代碼;
  • 在類加載時把類轉換成受測類。

大多數簡單直接的性能測量技術都依賴於以上其中一種或全部技術。

還應該提一下JVM工具接口(JVMTI),用它可以創建非常複雜的分析器,但它也有缺陷。它需要性能工程師編寫本地代碼,並且它產生的分析數值本質上是統計平均值,而不是直接測量結果。