编写程序测量 pthread_create、fork 两个函数的运行时间,并进行实测比较

#include"wrapper.h"
#include
void main() {
	struct timeval start, end;
	pid_t pid[100];
	pthread_t tid[100];
	int i;
	gettimeofday(&start, NULL);
	for (i = 0; i < 100; i++) {
		pthread_create(&tid[i], NULL, pthread_exit, NULL);//不能调用exit,否则父进程都会退出
	}
	gettimeofday(&end, NULL);
	printf("100次pthread_create:%ld微秒\n", end.tv_usec - start.tv_usec);

	gettimeofday(&start, NULL);
	for (i = 0; i < 100; i++) {
		if ((pid[i] = fork()) == 0) {
			exit(0);
		}
	}
	gettimeofday(&end, NULL);
	printf("100次fork:%lld微秒\n", (long long)(end.tv_usec - start.tv_usec));//数值比较大,防止变成负数

	for (i = 0; i < 100; i++) {
		waitpid(pid[i], NULL, WNOHANG);
		pthread_join(tid[i], NULL);
	}
	exit(0);

}

程序运行过程中,系统可能会去响应时钟中断等情况,由此一定会有相应的误差,建议多次实测取最小值,并把一次创建的线程(进程)的数量尽可能增大,使误差所占的比例缩小。

下面是gettimeofday函数及相关结构体的标注:(可以略过)

#include
int gettimeofday(struct  timeval* tv, struct  timezone* tz)
//timeval定义为:
struct  timeval{

	   long  tv_sec;/*秒*/
	   long  tv_usec;/*微妙*/
};

//timezone 结构定义为:
struct  timezone{
		int tz_minuteswest;/*和greenwich 时间差了多少分钟*/
		int tz_dsttime;/*type of DST correction*/
}


说明:在使用gettimeofday()函数时,第二个参数一般都为空,因为我们一般都只是为了获得当前时间,而不用获得timezone的数值,timezone即时区,初级阶段用不上。

waitpid()函数的第三个参数options:允许改变waitpid的行为。最常用的一个选项是WNOHANG, 它的作用是防止waitpid把调用者的执行挂起!

你可能感兴趣的:(linux编程)