跳到主內容

關於效能的更多思考

什麼是效能,以及為什麼效能很重要

什麼是效能?

#

效能是一個執行者(performer)的一組可量化屬性。

在此語境下,效能指的不是動作本身的執行,而是某人或某事表現得有多好。因此,我們使用形容詞 performant(高效能的)。

雖然 “表現有多好” 這一部分通常可以用自然語言描述,但在我們限定的範圍內,重點在於那些可以量化為實數的事物。實數包括整數和 0/1 二進位制值等特殊情況。自然語言的描述仍然非常重要。例如,一篇完全不用數字(可量化值)而僅僅用文字強烈批評 Flutter 效能的新聞文章,依然可以很有意義,併產生巨大的影響。之所以限定範圍,僅僅是因為我們的資源有限。

描述效能所需的量化指標通常被稱為度量標準(metric)。

為了梳理無數的效能問題和指標,你可以根據執行者進行分類。

例如,本網站的大部分內容是關於 Flutter 應用效能的,其中的執行者是 Flutter 應用。基礎設施(Infra)效能對 Flutter 同樣重要,執行者是構建機器人(build bots)和持續整合(CI)任務執行器:它們極大地影響了 Flutter 合併程式碼更改的速度,從而改善應用效能。

在這裡,我們特意拓寬了範圍,不僅限於應用效能問題,因為無論執行者是誰,它們都可以共享許多工具。例如,Flutter 應用效能和基礎設施效能可能共享同一個儀表板和類似的報警機制。

拓寬範圍也使得一些傳統上容易被忽略的執行者能夠被納入考量。文件效能就是這樣一個例子。執行者可以是 SDK 的 API 文件,而一個衡量指標可以是:認為該 API 文件有用的讀者比例。

為什麼效能很重要?

#

回答這個問題不僅對於驗證效能工作至關重要,而且對於指導效能工作以使其更有用也至關重要。“為什麼效能很重要?”的答案通常也是“效能如何發揮作用?”的答案。

簡而言之,效能之所以重要且有用,是因為在我們的範圍內,效能必須具備可量化的屬性或指標。這意味著:

  1. 效能報告易於解讀。
  2. 效能幾乎沒有歧義。
  3. 效能具有可比性和可轉換性。
  4. 效能是公平的。

這並不是說非效能問題,或者不可量化的問題或描述不重要。這些要點旨在強調效能可以發揮更大作用的場景。

1. 效能報告易於解讀

#

效能指標是數字。閱讀數字比閱讀段落容易得多。例如,工程師讀出一個 1 到 5 分的效能評級可能只需要 1 秒。而閱讀一份 500 字的完整反饋摘要,同一位工程師可能至少需要 1 分鐘。

如果有大量數字,很容易對它們進行彙總或視覺化,以便快速解讀。例如,你可以透過檢視直方圖、平均值、分位數等,快速掌握數百萬個數字的資訊。如果一個指標擁有數千個數據點的歷史記錄,你就可以輕鬆繪製趨勢圖來檢視其走向。

另一方面,如果有 n 個 500 字的文字,解讀這些文字的成本幾乎必然是 n 倍。分析數千條每條 500 字的歷史描述是一項艱鉅的任務。

2. 效能幾乎沒有歧義

#

將效能表現為一組數字的另一個優點是其無歧義性。當你要求動畫的效能達到每幀 20 毫秒或 50 fps 時,對於這些數字,人們幾乎沒有誤解的空間。相反,用文字描述同樣的動畫,有人可能稱之為“好”,而另一個人可能抱怨它“很差”。同樣,同一個詞或短語在不同人眼中可能含義不同。你可能認為 60 fps 是“還可以”的幀率,而其他人可能認為 30 fps 才算“還可以”。

數字仍然可能存在噪聲。例如,測量的每幀時間可能是該幀真正的計算時間,加上 CPU/GPU 在無關工作上花費的隨機時間(噪聲)。因此,指標會波動。儘管如此,數字的含義並無歧義。此外,還有嚴謹的理論和測試工具來處理這種噪聲。例如,你可以透過多次測量來估計隨機變數的分佈,或者透過大數定律取多次測量的平均值來消除噪聲。

3. 效能具有可比性和可轉換性

#

效能數字不僅含義明確,而且比較起來也毫無歧義。例如,5 大於 4 是毋庸置疑的。另一方面,要判斷“優秀(excellent)”是否比“極好(superb)”更好或更差,可能帶有主觀性。同樣,你能確定“史詩級(epic)”是否比“傳說級(legendary)”更好嗎?事實上,在某些人的解讀中,“強烈超出預期(strongly exceeds expectations)”可能比“極好”更好。只有在定義了對映關係(例如將“強烈超出預期”對映為 4,“極好”對映為 5)之後,它才變得無歧義且可比較。

數字還可以透過公式和函式輕鬆轉換。例如,60 fps 可以轉換為每幀 16.67 毫秒。一幀的渲染時間 x(毫秒)可以轉換為二元指標 isSmooth = [x <= 16] = (x <= 16 ? 1 :0)。這種轉換可以複合或鏈式進行,因此你可以在沒有任何額外噪聲或歧義的情況下,透過單一測量獲得多種多樣的量化指標。轉換後的量化指標隨後可用於進一步的比較和解讀。如果你處理的是自然語言,這種轉換幾乎是不可能的。

4. 效能是公平的

#

如果問題的發現依賴於冗長的文字,那麼那些更擅長表達(更願意聊天或寫作)的人,或者那些與開發團隊聯絡更緊密、擁有更大溝通頻寬且面對面交流成本更低的人,就會獲得不公平的優勢。

透過使用相同的指標來發現問題,無論使用者距離多遠或多麼沉默,我們都能公平地對待所有問題。反過來,這使我們能夠專注於那些具有更大影響力的正確問題。

如何讓效能(指標)發揮作用

#

以下內容從略微不同的角度總結了此處討論的 4 個要點:

  1. 使效能指標易於解讀。不要用大量的數字(或文字)讓讀者感到不知所措。如果數字很多,嘗試將其總結為較少的一組數字(例如,將多個數字總結為一個平均值)。僅在數字發生重大變化時通知讀者(例如,針對峰值或效能回退的自動警報)。

  2. 使效能指標儘可能無歧義。定義數字所使用的單位。精確描述數字是如何測量的。使數字易於復現。當存在大量噪聲時,儘量展示完整的分佈,或者透過聚合大量噪聲測量值來儘可能消除噪聲。

  3. 使效能易於比較。例如,提供時間軸來比較當前版本與舊版本。提供將一個指標轉換為另一個指標的方法和工具。例如,如果我們能將記憶體增長和 fps 下降都轉換為使用者流失數或美元形式的收入損失,那麼我們就可以對它們進行比較並做出明智的取捨。

  4. 使效能指標能夠監測儘可能廣泛的使用者群體,確保沒有人被遺忘。