天天看點

18、深入了解計算機系統筆記:測量程式執行時間

1、人不能夠覺察短于大約100ms的時間段。

2、計算機有一個外部計時器,它周期性地向處理器發送中斷信号。這些中斷信号之間的時間被稱為間隔時間(interval time)。

3、從一個程序切換到另一個程序需要幾千個時鐘周期來儲存目前目前程序的狀态。典型的計時器間隔範圍是1~10ms。

4、通過間隔計數(interval counting)來測量時間

OS也用計時器(timer)來記錄每個程序使用的累計時間,這種資訊提供的是對程式執行時間不那麼精确的測量值。這種方法隻對長持續時間(到少1s)的測量有用。

OS維護着每個程序使用的使用者時間量和系統時間量的計數值。

通過如下兩種方法讀程序的計數器

1)shell的指令前加time。

    結果前兩個值為指令程序執行的使用者和系統時間,第三個值為執行經過的總時間。

2)調用函數times來讀程序的計時器。

示例代碼

這些時間測量值是以時鐘滴答(clock tick)為機關來表示的。定義的常數CLK_TCK指明每秒的時鐘滴答數。The fields indicating child times give the

accumulated times used by children that have terminated and have been reaped.(意為每個子域給出了我們可能需求的一個子時間項,這些子時間項是由已經終止,且被回收的子程序所累積)。

是以,times不能用來監視任何正在進行的子程序所使用的時間。作為傳回值,傳回的是從系統啟動開始已經經過的時鐘滴答總數。

3)ANSI C定義了一個clock函數來測量目前程序使用的總時間。要将clock函數報告的時間變成秒數,要除以定義常數CLOCKS_PER_SEC,這個常數不一定與CLK_TCK相同。

5、通過周期計數器來測量時間

CPU上有一個特殊的計時器,每個時鐘周期加1。

本書9.3.1節講述了通過彙編代碼來擷取這個周期計數器的值的過程。可以得到在微觀尺度上很好的測量值。

同時講述了k次最優測量方法。

6、通過gettimeofday函數的測量

gettimeofday函數查詢系統時鐘(system clock)以确定目前的日期和時間。

在linux中,第二個參數設定成NULL,因為它指向一個未被實作的執行時區校正的特性。

實作依賴于gettimeofday是如何實作的,而gettimeofday的實作随系統不同而不同。

7、更多關于測量的方法和技巧,參見9.4,9.5,9.6,9.7。

<Computer Systems:A Programmer's Perspective>

繼續閱讀