1、人不能夠覺察短於大約100ms的時間段。
2、電腦有一個外部計時器,它周期性地向處理器發送中斷訊號。這些中斷訊號之間的時間被稱為間隔時間(interval time)。
3、從一個進程切換到另一個進程需要幾千個刻度來儲存當前當前進程的狀態。典型的計時器間隔範圍是1~10ms。
4、通過間隔計數(interval counting)來測量時間
OS也用計時器(timer)來記錄每個進程使用的累計時間,這種資訊提供的是對程式執行時間不那麼精確的測量值。這種方法只對長期間(到少1s)的測量有用。
OS維護著每個進程使用的使用者時間量和系統時間量的計數值。
通過如下兩種方法讀進程的計數器
1)shell的命令前加time。
結果前兩個值為命令進程執行的使用者和系統時間,第三個值為執行經過的總時間。
2)調用函數times來讀進程的計時器。
範例程式碼
#include <sys/times.h>struct tms {clock t tms utime; /* user time */clock t tms stime; /* system time */clock t tms cutime; /* user time of reaped children */clock t tms cstime; /* system time of reaped children */}clock t times(struct tms *buf);Returns: number of clock ticks elapsed since system started#include <time.h>clock t clock(void);Returns: total time used by process
這些時間測量值是以時鐘滴答(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)以確定當前的日期和時間。
範例程式碼
#include "time.h"struct timeval {long tv sec; /* Seconds */long tv usec; /* Microseconds */}int gettimeofday(struct timeval *tv, NULL);Returns: 0 for success, -1 for failure
在linux中,第二個參數設定成NULL,因為它指向一個未被實現的執行時區校正的特性。
範例程式碼
#include <stdlib.h>#include <stdio.h>#include <time.h>/* $begin tod */#include <sys/time.h>#include <unistd.h>static struct timeval tstart;/* Record current time */void start_timer(){ gettimeofday(&tstart, NULL);}/* Get number of seconds since last call to start_timer */double get_timer(){ struct timeval tfinish; long sec, usec; gettimeofday(&tfinish, NULL); sec = tfinish.tv_sec - tstart.tv_sec; usec = tfinish.tv_usec - tstart.tv_usec; return sec + 1e-6*usec;}/* $end tod */
實現依賴於gettimeofday是如何?的,而gettimeofday的實現隨系統不同而不同。
7、更多關於測量的方法和技巧,參見9.4,9.5,9.6,9.7。
<Computer Systems:A Programmer's Perspective>