1. 時間表示
使用date命令輸出系統當前時間。
#include <time.h>
time_t time(time_t * tloc);
char* ctime(const time_t *clock);
/*
time 函數返回從 1970 年 1 月 1 日 0 點以來的秒數.存儲在 time_t 結構之中.不過這個函數的返回值對於我們來說沒有什麼實際意義.這個時候我們使用第二個函數將秒數轉化爲字符串.
ctime這個函數的返回類型是固定的:一個可能值爲. Thu Dec 7 14: 58: 59 2000 這個字符串的長度是固定的爲 26.
*/
2. 時間測量
要計算程序執行的時間,比如對算法的時間要求
#include <sys/time.h>;
int gettimeofday(struct timeval *tv,struct timezone *tz);
strut timeval {
long tv_sec; /* 秒數 */
long tv_usec; /* 微秒數 */
};
/*gettimeofday 將時間保存在結構 tv 之中.
tz 一般使用 NULL 來代替*/
實例:
#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);
}
/*這個程序輸出函數的執行時間,我們可以使用這個來進行系統性能的測試,或者是函數算法的效率分析.*/
3. 使用計時器
linux系統爲每一個進程提供了3個內部間隔計時器。
ITIMER_REAL: 減少實際時間.到時的時候發出 SIGALRM 信號.
ITIMER_VIRTUAL: 減少有效時間(進程執行的時間).產生 SIGVTALRM 信號.
ITIMER_PROF: 減少進程的有效時間和系統時間(爲進程調度用的時間).
這個經常和上面一個使用用來計算系統內核時間和用戶時間.產生 SIGPROF 信號.
具體的操作函數是:
#include <sys/time.h>;
int getitimer(int which,struct itimerval *value);
/*getitimer 函數得到間隔計時器的時間值.保存在 value 中*/
int setitimer(int which,struct itimerval *newval,
struct itimerval *oldval);
/*setitimer 函數設置間隔計時器的時間值爲 newval.並將舊值保存在 oldval 中. */
struct itimerval {
struct timeval it_interval;
struct timeval it_value;
}
which 表示使用三個計時器中的哪一個.
itimerval 結構中的 it_value 是減少的時間,當這個值爲 0 的時候就發出相應的信號了. 然後設置爲 it_interval 值.
實例:
#include <sys/time.h>;
#include <stdio.h>;
#include <unistd.h>;
#include <signal.h>;
#include <string.h>;
#define PROMPT "時間已經過去了兩秒鐘\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);
}
這個程序每執行兩秒中之後會輸出一個提示.