天天看點

《程式設計珠玑(續)(修訂版)》—第1章1.3節專用的性能監視工具

本節書摘來自異步社群《程式設計珠玑(續)(修訂版)》一書中的第1章,第1.3節專用的性能監視工具,作者【美】jon bentley,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

1.3 專用的性能監視工具

到目前為止我們所看到的性能監視工具的原理,适用于從彙編和fortran直到ada這樣的程式設計語言,但是很多程式員現在使用更強大的語言。如何監視lisp或apl程式的計算性能?又如何監視網絡或資料庫語言程式的計算性能?

我們打算用unix的管道(pipeline)作為更有趣的計算模型的例子。管道是一系列的過濾程式(filter):當資料流經每個過濾程式時,對資料施加變換。下面這個經典的管道按照頻率遞減順序列印某檔案中使用最多的25個單詞③。

當用這個管道在一本大約6萬字的書中尋找25個最常見的單詞時,我們監視這個管道的性能。輸出的前6行是:

下面是對vax-11/750上計算的“管道性能監視”:

左邊幾列說明每個階段的資料:行數、單詞數、字元數。右邊部分描述了資料階段之間的過濾程式:用秒表示的使用者時間、系統時間以及真實時間,後面是指令本身。

這個性能監視結果給出了程式員感興趣的許多資訊。這個管道是快速的,處理150頁的書隻需3.5分鐘。第一次排序花了這個管道57%的運作時間,這種經過仔細調優的實用程式很難再提速了。第二次排序隻花了這個管道14%的時間,但是還有調優的餘地④。這個性能監視結果還發現了管道中隐藏的一處小錯誤。unix高手們會樂于找出引入空行的地方。

這個性能監視結果也透露了檔案中單詞的資訊:共有57 651個單詞,但隻有4731個不同的單詞。在第一個翻譯程式之後,每個單詞有4.3個字母。輸出表明,最常見的單詞是“the”,占了檔案的6%。6個最常見的單詞占了檔案的18%。對英語中最常見的100個單詞做專門處理也許還能提高速度。試試看從這些計數中找出其他有趣的表面規律。

跟許多unix使用者一樣,我過去也用手工監視管道的性能,利用單詞計數(wc)指令來統計檔案,用time指令來統計程序。“管道性能監視工具”讓這個任務自動化了。用管道和一些輸入檔案的名稱作為輸入,産生性能監視結果作為輸出。2個小時和50行代碼就足以建立這個性能監視工具。下一節詳細闡述這個話題。