前言:Linux下的時(shí)間概念
這一章我們學(xué)習(xí)Linux的時(shí)間表示和計(jì)算函數(shù)
時(shí)間的表示
時(shí)間的測(cè)量
計(jì)時(shí)器的使用
1。時(shí)間表示 在程序當(dāng)中,我們經(jīng)常要輸出系統(tǒng)當(dāng)前的時(shí)間,比如我們使用date命令
的輸出結(jié)果.這個(gè)時(shí)候我們可以使用下面兩個(gè)函數(shù)
- #include <time.h>
-
- time_t time(time_t *tloc);
- char *ctime(const time_t *clock);
time函數(shù)返回從1970年1月1日0點(diǎn)以來(lái)的秒數(shù).存儲(chǔ)在time_t結(jié)構(gòu)之中.不過(guò)這個(gè)函數(shù)的返
回值對(duì)于我們來(lái)說(shuō)沒(méi)有什么實(shí)際意義.這個(gè)時(shí)候我們使用第二個(gè)函數(shù)將秒數(shù)轉(zhuǎn)化為字符串
.. 這個(gè)函數(shù)的返回類型是固定的:一個(gè)可能值為. Thu Dec 7 14:58:59 2000 這個(gè)字符串
的長(zhǎng)度是固定的為26
2。時(shí)間的測(cè)量 有時(shí)候我們要計(jì)算程序執(zhí)行的時(shí)間.比如我們要對(duì)算法進(jìn)行時(shí)間分析
..這個(gè)時(shí)候可以使用下面這個(gè)函數(shù).
- #include <sys/time.h>
-
- int gettimeofday(struct timeval *tv,struct timezone *tz);
- strut timeval {
- long tv_sec;
- long tv_usec;
- };
- gettimeofday將時(shí)間保存在結(jié)構(gòu)tv之中.tz一般我們使用NULL來(lái)代替.
- [codes=c]
- #include <sys/time.h<
- #include <stdio.h<
- #include <math.h<
- void function()
- {
- unsigned int i,j;
- double y;
- for(i=0;i<1000;i++)
- for(j=0;j<1000;j++)
- y=sin((double)i);
- }
- main()
- {
- struct timeval tpstart,tpend;
- float timeuse;
- gettimeofday(&tpstart,NULL);
- function();
- gettimeofday(&tpend,NULL);
- timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+
- tpend.tv_usec-tpstart.tv_usec;
- timeuse/=1000000;
- printf("Used Time:%f\n",timeuse);
- exit(0);
- }
這個(gè)程序輸出函數(shù)的執(zhí)行時(shí)間,我們可以使用這個(gè)來(lái)進(jìn)行系統(tǒng)性能的測(cè)試,或者是函數(shù)算
法的效率分析.在我機(jī)器上的一個(gè)輸出結(jié)果是: Used Time:0.556070
3。計(jì)時(shí)器的使用 Linux操作系統(tǒng)為每一個(gè)進(jìn)程提供了3個(gè)內(nèi)部間隔計(jì)時(shí)器.
ITIMER_REAL:減少實(shí)際時(shí)間.到時(shí)的時(shí)候發(fā)出SIGALRM信號(hào).
ITIMER_VIRTUAL:減少有效時(shí)間(進(jìn)程執(zhí)行的時(shí)間).產(chǎn)生SIGVTALRM信號(hào).
ITIMER_PROF:減少進(jìn)程的有效時(shí)間和系統(tǒng)時(shí)間(為進(jìn)程調(diào)度用的時(shí)間).這個(gè)經(jīng)常和上面一
個(gè)使用用來(lái)計(jì)算系統(tǒng)內(nèi)核時(shí)間和用戶時(shí)間.產(chǎn)生SIGPROF信號(hào).
具體的操作函數(shù)是:
- #include <sys/time.h>
- int getitimer(int which,struct itimerval *value);
- int setitimer(int which,struct itimerval *newval,
- struct itimerval *oldval);
- struct itimerval {
- struct timeval it_interval;
- struct timeval it_value;
- }
getitimer函數(shù)得到間隔計(jì)時(shí)器的時(shí)間值.保存在value中 setitimer函數(shù)設(shè)置間隔計(jì)時(shí)器
的時(shí)間值為newval.并將舊值保存在oldval中. which表示使用三個(gè)計(jì)時(shí)器中的哪一個(gè).
itimerval結(jié)構(gòu)中的it_value是減少的時(shí)間,當(dāng)這個(gè)值為0的時(shí)候就發(fā)出相應(yīng)的信號(hào)了. 然
后設(shè)置為it_interval值.
- #include <sys/time.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <signal.h>
- #include <string.h>
- #define PROMPT "時(shí)間已經(jīng)過(guò)去了兩秒鐘\n\a"
- char *prompt=PROMPT;
- unsigned int len;
- void prompt_info(int signo)
- {
- write(STDERR_FILENO,prompt,len);
- }
- void init_sigaction(void)
- {
- struct sigaction act;
- act.sa_handler=prompt_info;
- act.sa_flags=0;
- sigemptyset(&act.sa_mask);
- sigaction(SIGPROF,&act,NULL);
- }
- void init_time()
- {
- struct itimerval value;
- value.it_value.tv_sec=2;
- value.it_value.tv_usec=0;
- value.it_interval=value.it_value;
- setitimer(ITIMER_PROF,&value,NULL);
- }
- int main()
- {
- len=strlen(prompt);
- init_sigaction();
- init_time();
- while(1);
- exit(0);
- }
這個(gè)程序每執(zhí)行兩秒中之后會(huì)輸出一個(gè)提示.