Linux下時間度量的深入分析

2021-09-30 04:48:41 字數 4507 閱讀 6814

一)ansi clock函式

1)概述:

clock 函式的返回值型別是clock_t,它除以clocks_per_sec來得出時間,一般用兩次clock函式來計算程序自身執行的時間.

ansi clock有三個問題:

1)如果超過乙個小時,將要導致溢位.

2)函式clock沒有考慮cpu被子程序使用的情況.

3)也不能區分使用者空間和核心空間.

所以clock函式在linux系統上變得沒有意義.

2)測試

編寫test1.c程式,測試採用clock函式的輸出與time程式的區別.

vi test1.c 

#include

#include

#include

int main( void ) 

finish = clock(); 

duration = (double)(finish - start) / clocks_per_sec;

printf( "%f seconds ", duration ); 

return 0;

}gcc test1.c -o test1

time ./test1

time to do 1000 empty loops is 0.180000 seconds

real    0m3.492s

user    0m0.512s

sys     0m2.972s

3)總結:

(1)程式呼叫 system("cd");,這裡主要是系統模式子程序的消耗,test1程式不能體現這一點.

(2)0.180000 seconds秒的消耗是兩次clock()函式呼叫除以clocks_per_sec.

(3)clock()函式返回值是乙個相對時間,而不是絕對時間.

(4)clocks_per_sec是系統定義的巨集,由gnu標準庫定義為1000000.

二)times()時間函式

1)概述:

原型如下:

clock_t times(struct tms *buf);

tms結構體如下:

strace tms

注釋:tms_utime記錄的是程序執行使用者**的時間.

tms_stime記錄的是程序執行核心**的時間.

tms_cutime記錄的是子程序執行使用者**的時間.

tms_cstime記錄的是子程序執行核心**的時間.

2)測試:

vi test2.c 

#include

#include

#include

#include

#include

static void do_cmd(char *);

static void pr_times(clock_t, struct tms *, struct tms *);

int main(int argc, char *ar**)

exit(1);

}static void do_cmd(char *cmd)

static void pr_times(clock_t real, struct tms *tmsstart, struct tms *tmsend)

編譯:gcc test2.c -o test2

測試這個程式:

time ./test2 "dd if=/dev/zero f=/dev/null bs=1m count=10000"

10000+0 records in

10000+0 records out

10485760000 bytes (10 gb) copied, 4.93028 s, 2.1 gb/s

real:   4.94

user-cpu:   0.00

system-cpu:   0.00

child-user-cpu:   0.01

child-system-cpu:   4.82

real    0m4.943s

user    0m0.016s

sys     0m4.828s

3)總結:

(1)通過這個測試,系統的time程式與test2程式輸出基本一致了.

(2)(double)clktck是通過clktck=sysconf(_sc_clk_tck)來取的,也就是要得到user-cpu所占用的時間,就要用

(tmsend->tms_utime - tmsstart->tms_utime)/(double)clktck);

(3)clock_t times(struct tms *buf);返回值是過去一段時間內時鐘嘀嗒的次數.

(4)times()函式返回值也是乙個相對時間.

三)實時函式clock_gettiem

在posix1003.1中增添了這個函式,它的原型如下:

int clock_gettime(clockid_t clk_id, struct timespec *tp);

它有以下的特點:

1)它也有乙個時間結構體:timespec ,timespec計算時間次數的單位是十億分之一秒.

strace timespec

2)clockid_t是確定哪個時鐘型別.

clock_realtime: 標準posix實時時鐘

clock_monotonic: posix時鐘,以恆定速率執行;不會復位和調整,它的取值和clock_realtime是一樣的.

clock_process_cputime_id和clock_thread_cputime_id是cpu中的硬體計時器中實現的.

3)測試:

#include

#include

#include

#define million 1000000

int main(void)

clock_gettime(clock_monotonic, &tpend);

timedif = million*(tpend.tv_sec-tpstart.tv_sec)+(tpend.tv_nsec-tpstart.tv_nsec)/1000;

fprintf(stdout, "it took %ld microseconds ", timedif);

return 0;

}編譯:

gcc test3.c -lrt -o test3

real    0m3.467s

user    0m0.512s

sys     0m2.936s

四)時間函式gettimeofday()

1)概述:

gettimeofday()可以獲得當前系統的時間,是乙個絕對值

原型如下:

int gettimeofday ( struct timeval * tv , struct timezone * tz )

timeval結型體的原型如下:

struct timeval ;

所以它可以精確到微秒

測試:#include

#include

#include

intmain()

gcc test5.c

./a.out 

time: 0.041239000000

五)四種時間函式的比較

1)精確度比較:

以下是各種精確度的型別轉換:

1秒=1000毫秒(ms), 1毫秒=1/1000秒(s); 

1秒=1000000 微秒(μs), 1微秒=1/1000000秒(s); 

1秒=1000000000 納秒(ns),1納秒=1/1000000000秒(s);

2)clock()函式的返回值為毫秒(ms)

times()函式的返回值也是毫秒(ms)

gettimofday()函式的返回值是微秒(μs)

clock_gettime()函式的計量單位為十億分之一,也就是納秒(ns)

3)測試4種函式的精確度:

vi test4.c

#include   

#include   

#include   

#include   

#include   

#include   

#define wait for(i=0;i<298765432;i++);

#define million    1000000

intmain ( int argc, char *ar** )

gcc -lrt test4.c -o test4

debian:/tmp# ./test4

clock time : 1.190000000000

times time : 1.180000000000

gettimeofday time: 1.186477000000

clock_gettime time: 1.179271718000

**:

linux的man命令深入分析

man有如下8個模組.1 shell中使用者可用的命令 2 使用函式庫中程式可用的系統呼叫 3 程式中可用的庫函式 4 dev目錄中可用的裝置 5 多種雜項系統檔案 ex etc 6 如果有的話,遊戲程式 7 雜項資訊 8 管理員可用的命令 1 man命令是如何搜尋命令對映的幫助檔案的?2 幫助檔案...

new的深入分析

new 是c 的乙個關鍵字,同時也是操作符。關於new的話題非常多,因為它確實比較複雜,也非常神秘,下面我將把我了解到的與new有關的內容做乙個總結。new的過程 當我們使用關鍵字new在堆上動態建立乙個物件時,它實際上做了三件事 獲得一塊記憶體空間 呼叫建構函式 返回正確的指標。當然,如果我們建立...

Linux檔案許可權隱藏的細節深入分析

linux是乙個安全的作業系統,她是以檔案為基礎而設計的,其檔案許可權是比較複雜的,可以用stat命令以及lsattr命令來顯示某個檔案的詳細資訊 stat file1 file file1 size 11904 blocks 24 io block 4096 regular file device...