一)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...