基于LINUX操作系统下的各种详细配置(如FTP

源代码在线查看: linux_timer .txt

软件大小: 2786 K
上传用户: alsczhang
关键词: LINUX FTP 操作系统
下载地址: 免注册下载 普通下载 VIP

相关代码

				goldcattle@gmail.com 转载请申明来自ol 
				
				Linux 中的计时 
				用C语言进行计时 
				在用户空间中可以使用C语言函数gettimeofday 得到时间,它的调用格式是: 
				#include 
				int gettimeofday(struct timeval *tv, struct timezone *tz); 
				int settimeofday(const struct timeval *tv , const struct timezone *tz); 
				结构timeval的定义为: 
				strut timeval { 
				long tv_sec; /* 秒数 */ 
				long tv_usec; /* 微秒数 */ 
				}; 
				可以看出,使用这种方式计时,精度可达微秒,也就是10-6秒。进行计时的时候,我们需要前后调用两次gettimeofday,然后计算中间的差值: 
				gettimeofday( &start, NULL ); 
				foo(); 
				gettimeofday( &end, NULL ); 
				timeuse = 1000000 * ( end.tv_sec - start.tv_sec ) + end.tv_usec - start.tv_usec; 
				timeuse /= 1000000; 
				
				Shell计时 
				在Linux的Shell下,我们经常也使用Shell内置的time命令和GNU版的time命令来测试程序运行的时间。 
				内置的time提供的参数选项比较少,而GNU的time则提供了丰富的参数选项,包括指定输出文件等功能。 
				[grandiose@Bygone grandiose]$ /usr/bin/time --output=foo.txt foo 
				
				上句只有时间信息输出到了foo.txt文件中,如果想要包括foo执行的结果,就需要按下句这样使用: 
				[grandiose@Bygone grandiose]$ /usr/bin/time --output=foo.txt --append foo >foo.txt 
				如果想要控制输出时间的格式,可以使用-f开关进行格式化: 
				[grandiose]$ /usr/bin/time --output=foo.txt -f "\\t%E real,\\t%U user,\\t%S sys" foo 
				如果仍需要使用Shell内置的time命令,可以用下面一句将结果输出至文件: 
				[grandiose@Bygone grandiose]$ (time foo) 2>foo.txt 
				这样写是因为内置命令time的输出是到标准错误的,文件描述符2表示标准错误stderr。如果还想要包括foo执行的结果,就要这样: 
				[grandiose@Bygone grandiose]$ (time foo) >foo.txt 2>&1 
				其中2>&1的含义是2与1 相同,一起送入foo.txt中。 
				
				nohup命令可以保证进程在退出系统之后仍能运行,这是它的常规用法。我们也可以这样使用nohup: 
				[grandiose@Bygone grandiose]$ nohup time foo 
				
				结果全部输出至nohup.out,也包括程序运行的时间信息。可以使用下面的语句将时间信息输出至文件foo.txt中。 
				
				[grandiose@Bygone grandiose]$ tail -2 nohup.out > foo.txt 
				为了保证和POSIX一致,输出的时间格式为(nohup.out中的内容除外): 
				real 0m0.007s 
				user 0m0.002s 
				sys 0m0.004s 
				
				我们可以使用linux下面一些过滤命令如awk、sed、grep、tr等过滤出我们想要得到的内容,例如想要得到real段对应的时间: 
				
				
				[grandiose@Bygone grandiose]$ grep real foo.txt | cut -f2,或者 
				[grandiose@Bygone grandiose]$ sed -n '2p' foo.txt | cut -f2 
				在Shell下,输出的时间精度为毫秒级,如果需要微秒级的计时,那就应该在程序中进行处理。 
				
				内核空间中的计时 
				
				如果要定制自己的设备驱动程序,可能就会用到内核里的计时功能。Linux内核空间中的计时与用户空间的计时不太相同。在内核空间里,有一个全局变量Jiffies维护着当前的时间。与系统时钟有关的调用有(新的定时服务): #include 
				#include 
				void add_timer(struct timer_list * timer); 
				int del_timer(struct timer_list * timer); 
				inline void init_timer(struct timer_list * timer); 
				
				
				
				
				结构struct timer_list的定义为: 
				
				
				struct timer_list { 
				struct timer_list *next; 
				struct timer_list *prev; 
				unsigned long expires; 
				unsigned long data; 
				void (*function)(unsigned long d); 
				}; 
				
				
				
				
				其中过期时间expires是要执行function的时间。一般在调用add_timer时jiffies = jiffies + num,表示在num个系统最小时间间隔后执行function。系统最小时间间隔与所用的硬件平台有关, 在核心里定义了常数HZ表示一秒内最小时间间隔的数目,则num*HZ表示num 秒。系统计时到预定时间就调用function,并把此子程序从定时队列里删除, 因此如果想要每隔一定时间间隔执行一次的话,就必须在function里再一次调用add_timer。function的参数d即为timer里面的data项。 
				
				Jiffies的计时精度是百分之一秒,如果在内核中需要更为精确的计时,就需要用到time_calls.h中的函数,它们可用于高精度的时间计算。 
				
				补充 
				
				有的时候,我们需要较为精确地得出被测目标的运行时间,这时一般需要多次运行取均值以消除误差。 
				
				
				gettimeofday( &start, NULL ); 
				for ( int i = 0; ifoo.tmp 
				grep real foo.tmp | cut -f2 >> foo.txt 
				done 
				
				
				
				
				如果计时次数较多,则需要: 
				
				
				i=1 
				while [ $i -le 100 ] 
				do 
				(time foo) 2>foo.tmp 
				grep real foo.tmp | cut -f2 >> foo.txt 
				i=`expr $i + 1` 
				done 
				
				
				
				
				写进foo.txt的内容如果手动来计算平均值,会比较费时,我们可以写一段Shell脚本或用C语言来读取文件,计算其均值。 
				
				
				/*耗时中分部总和*/ 
				cut -d'm' -f1 foo.txt > foo.tmp 
				sum=0 
				while read line 
				do 
				sum=$(echo "$sum+$line" | bc -l) 
				done foo.tmp 
				sum=0 
				while read line 
				do 
				sum=$(echo "$sum+$line" | bc -l) 
				done < foo.tmp 
				echo $sum 
				
				
				
				计算出分部与秒部总和之后,然后再手动计算平均值,这样要容易得多。注意,上面没有使用expr进行计算的原因,是因为expr只能支持整型值。在Linux shell下,如果要计算浮点数,就需要使用bc或者是gexpr。 
				
				实际上,我们还可以使用诸如Perl、Python等多种语言在Linux系统中进行计时。选择何种工具或语言进行计时,这与被测程序或程序段的类型以及它们的编写语言相关。综合考虑精度、运行时间、运行次数等要求,才能合理可靠地得出程序的运行时间。 
				
							

相关资源