前言& w5 A5 K/ u3 Z3 ~) X* e8 C1 ~
这一章我们学习linux的时间表示和计算函数
& }% c. d: }: m' q 1.时间的表示
5 ?8 d! |4 K. F4 N3 U+ U; V) S 2.时间的测量
; q8 | p2 ^3 e" f5 a- \) ^ 3.计时器的使用
7 R- D! i1 u2 o+ f- j$ S 在程序当中,我们经常要输出系统当前的时间,比如我们使用date命令的输出结果.这个时候我们可以使用下面两个函数! ~$ i. s8 k# z: s4 m
#include
& d1 R! _# X# X; A Z* I2 ^ time_t time(time_t *tloc);
& w9 b. O' u0 }8 w" k char *ctime(const time_t *clock);
0 W9 N: @2 M+ L2 V) F: ? time函数返回从1970年1月1日0点以来的秒数.存储在time_t结构之中.不过这个函数的返回值对于我们来说没有什么实际意义.这个时候我们使用第二个函数将秒数转化为字符串. 这个函数的返回类型是固定的:一个可能值为. thu dec 7 14:58:59 2000 这个字符串的长度是固定的为269 |( f) O% @( ?/ i
有时候我们要计算程序执行的时间.比如我们要对算法进行时间分析.这个时候可以使用下面这个函数.1 r' U7 h7 n: M) I
#include( q4 V) Z! J7 N/ z2 l
int gettimeofday(struct timeval *tv,struct timezone *tz);
! b) S) c( h3 N8 p strut timeval {/ A# f5 @& R/ e3 M8 ^; [
long tv_sec; /* 秒数 */. d0 e% r% G. I( w) ]
long tv_usec; /* 微秒数 */
% I; ~' O; |+ h+ ^ };( v% R+ F, D" p/ W7 S, B
gettimeofday将时间保存在结构tv之中.tz一般我们使用null来代替. D! l0 D! y4 Y
#include
% @6 a- z. k4 }6 I8 A' ] #include0 o& d4 m4 F) ^
#include' N/ ~- a( v9 K( Z
void function()
3 E) B" g' J# Y$ b" I8 p. o {
3 d; m/ ?! Z# k unsigned int i,j;
: _) h2 b# L* \1 g4 f double y;
- v3 b% g$ L9 r3 W4 L5 { for(i=0;i1000;i++)5 O% p. C( r* M6 E! n0 [
for(j=0;j1000;j++)5 p, N/ E3 c& g `
y=sin((double)i);+ ]4 u( c" s. Y# o
}
! z! v O8 Z1 E2 J. L main()$ u1 s4 ~1 C( o# A3 s
{' ]- ?$ w& a* K" c" d3 ^2 @
struct timeval tpstart,tpend;5 X: _, z8 s' ~4 ^; f; j3 t4 s! z. T
float timeuse;
7 M8 p" c: J0 J# J; A gettimeofday(&tpstart,null);
5 [ h, T. Y: y& a) [4 |0 \( b function();
$ o1 B g5 ~# w5 W1 H. } gettimeofday(&tpend,null);
( Z8 [ i" j+ `3 T) D timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+& j8 [5 t$ @6 |$ y9 V
tpend.tv_usec-tpstart.tv_usec;
, H: C! O( R/ f& t& j, N timeuse/=1000000;
9 {' F, k# K0 D1 q+ Y! ?9 @ printf(“"used time:%f““n“",timeuse);$ e+ V E9 [1 c8 d% S
exit(0);
) X4 U) Y* L, A0 e$ N3 v6 s0 I }
& v. n X- U+ G0 _: E! Y, U, ^1 e 这个程序输出函数的执行时间,我们可以使用这个来进行系统性能的测试,或者是函数算法的效率分析.在我机器上的一个输出结果是: used time:0.5560709 m/ x ]' e% j) E2 x
linux操作系统为每一个进程提供了3个内部间隔计时器.+ T+ D/ ~ n& J; C4 v
itimer_real:减少实际时间.到时的时候发出sigalrm信号.) X( I; G- F. L/ k
itimer_virtual:减少有效时间(进程执行的时间).产生sigvtalrm信号.7 _8 i/ M& r+ ^+ u4 n u
itimer_prof:减少进程的有效时间和系统时间(为进程调度用的时间).这个经常和上面一个使用用来计算系统内核时间和用户时间.产生sigprof信号.
% b4 U$ u- x6 a, e) H$ C 具体的操作函数是:
& z& ~8 z7 g) \ @" N #include
- k) p- I& b, W( S" N int getitimer(int which,struct itimerval *value);5 e9 x1 D# I, s) k
int setitimer(int which,struct itimerval *newval,0 _: M% ~. D3 v9 _9 x) J
struct itimerval *oldval);
. l9 Z3 ~& f( X: _9 F# C struct itimerval {
' I# x$ F1 p. G8 ]4 ?- [6 f struct timeval it_interval;- ^6 F7 S5 W3 L0 _
struct timeval it_value;
0 L0 @& Y" y% p5 Z' G' ~ }3 U# P1 b4 q" ?8 |5 w9 n0 }4 I$ ~6 Q
getitimer函数得到间隔计时器的时间值.保存在value中 setitimer函数设置间隔计时器的时间值为newval.并将旧值保存在oldval中. which表示使用三个计时器中的哪一个. itimerval结构中的it_value是减少的时间,当这个值为0的时候就发出相应的信号了. 然后设置为it_interval值.9 ?' Q: s; i i- r9 T
#include
* v" F5 a4 L' K& C% Q# d v7 s #include
) @) v5 T: s5 a8 o4 k t #include
; J, o# F/ [+ n# ] ? #include
) H$ F9 x% K3 U6 _4 z& ~ #include
- o B) ?2 A/ t" f% u% X g #define prompt “"时间已经过去了两秒钟““n““a“"
& z! K8 W; u! ?# a6 z) V char *prompt=prompt;* V* u0 @ |: d; U. E. I# T$ }
unsigned int len;
, r* P( W6 A# l; H8 O* l void prompt_info(int signo)
7 X2 t) s1 N3 }$ u6 H {- l6 _/ M9 h+ d
write(stderr_fileno,prompt,len); W1 b, _8 v0 c- s0 E7 R
}1 m1 N& E. S# \5 i" s3 d1 u' g
void init_sigaction(void)
^9 F- ?/ E* q$ {1 h6 g3 c1 s {
R- ]+ Z% N6 A3 ]3 ? struct sigaction act;
% l! S2 V* e3 [0 W; j( u act.sa_handler=prompt_info;; o8 M9 ^& X* G" L6 ]
act.sa_flags=0;, { ^5 s3 d; i( E/ \* m* b# u
sigemptyset(&act.sa_mask);
/ L( H2 h' W- U* c2 P$ \1 P sigaction(sigprof,&act,null);
# Y4 r! |8 @0 `4 A } Z) q* R+ P1 N8 f: E
void init_time()
& Y. X3 k6 H. U& o {
p7 V1 A% ?2 U" e0 K N struct itimerval value;* I) Y Q4 I" Z+ g( d
value.it_value.tv_sec=2;
* L4 ~0 v3 O* { value.it_value.tv_usec=0;
% G& L- N5 I: B- ~ value.it_interval=value.it_value;8 ]0 g, Q( N4 Q% c$ g x8 I
setitimer(itimer_prof,&value,null);4 ^* B- P8 C" S+ t3 z. y
}
: w8 E* n8 a& T8 f2 \2 R% ^4 i, q int main()
, T! b( m/ h7 A, t* B# ^, T9 A) K {
' E$ p7 v) j. k. C# B, v. o% a len=strlen(prompt);
3 d* {: t! Z3 l9 Q init_sigaction();
' e6 f+ y. W& V/ _7 o init_time();
1 ^4 p0 d( r0 u) z: z9 o while(1); X: F) W- \- C2 P9 `( s
exit(0);7 a3 k- ?# R$ k) \- u0 y0 s; n
}$ V' W: a0 K" K1 I$ {3 l
这个程序每执行两秒中之后会输出一个提示. |