天天看點

《程式設計珠玑(續)(修訂版)》—第1章1.4節開發性能監視工具

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

1.4 開發性能監視工具

開發一個真正的性能監視工具是件困難的事情。peter weinberger⑤開發了c行計數性能監視工具,我們前面看到的輸出就是這個工具産生的。他在幾個月時間内斷斷續續幹了好幾周才完成這個項目。本節描述如何更容易地開發一個簡化版本。

dick sites聲稱他的朋友“在某個周末實作了語句計數”。我覺得這簡直難以置信,于是我決定要試着為附錄a描述的awk語言(這種語言還沒有性能監視工具)開發一個性能監視工具。幾小時後,當我運作程式p6的awk版本時,我的性能監視工具生成了如下輸出。

程式p6及性能監視工具生成的輸出

在左花括号後尖括号内的數顯示該語句塊被執行了多少次。幸運的是,這些計數與c行計數器産生的計數一樣。

我的性能監視工具包含兩個5行的awk程式。第一個程式讀awk源程式并且寫一個新程式,其中在每個語句塊開始的地方給不同的計數器加1;而在執行結束時,一個新的end動作(見附錄a)把所有計數寫入一個檔案。當這樣得出的程式運作時,就生成一個計數檔案。第二個程式讀出這些計數,把這些計數合并到源文本中。帶性能監視的程式大約比原來的程式慢25%,而且并不是所有的awk程式都能正确處理——為了監視幾個程式的性能,我不得不做出整行(one-line)的修改。但對于所有這些缺點來說,搭起一個能運作的性能監視工具,花幾小時并不算什麼大投入。在awk programming language一書的7.2節給出了一個類似的awk性能監視工具的細節,本書2.6節引用了這本書。

人們實作過一些快速性能監視工具,但鮮見報道。下面舉幾個例子。

在1983年8月的byte雜志上,leas和wintz描述了一個性能監視工具,用一個20行的6 800彙編語言程式來實作。

貝爾實驗室的howard trickey在一小時内用lisp實作了函數計數,辦法是修改defun,在進入每個函數時給計數器加1。

1978年,rob pike⑥用20行fortran程式實作了一個時間性能監視工具。在call profil(10)之後,後續的cpu時間被計入計數器10。

在這些系統和許多其他系統上,在一晚上寫出一個性能監視工具是可能的。在你第一次使用所得到的性能監視工具時,這個工具輕易就能節省超過一個晚上的工作量。