IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Linux | Open source  >

RunTime: Block memory copy

High performance programming techniques on Linux and Windows

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

Dr. Edward G. Bradford (egb@us.ibm.com), Senior Programmer, IBM

2001 年 6 月 01 日

Sample code that illustrates the main loop of memxfer5b.cpp

Main loop of memxfer5b.cpp
        
 
	//
	// If no methods entered, use "0" which is memcpy.
	//
	if(ac == 3) {
		ac = 4;
		av[3] = "0";
	}
	for(; ac > 3; ac--, av++) {
		if(isdigit(*av[3])) method = *av[3] - '0';
		if(method < 0 || method >= nmethods)
			method = 0;
		if(sflag)
			tstart();
		for(ui = 0; ui < cnt; ui++) {
			if(!sflag) {
				(void)printf("%s %d %d %-18.18s\t",
						progname, size, cnt, methods[method]);
				tstart();
			}
			if(fflag == 1) {
				p1 = (char *)Malloc(size);
				p2 = (char *)Malloc(size);
			}
			switch(method) {
			case 0:
				(void)memcpy(p1, p2, size);
				break;
			case 1:
				p = p1;
				q = p2;
				for(j = 0; j < size; j++)
					*p++ = *q++;
				break;
			case 2:
				sp = (short *)p1;
				sq = (short *)p2;
				for(j = 0; j < size; j += sizeof(short))
					*sp++ = *sq++;
				break;
			case 3:
				ip = (int *)p1;
				iq = (int *)p2;
				for(j = 0; j < size; j += sizeof(int))
					*ip++ = *iq++;
				break;
			case 4:
				lp = (long *)p1;
				lq = (long *)p2;
				for(j = 0; j < size; j += sizeof(long))
					*lp++ = *lq++;
				break;
			case 5:
				llp = (__int64 *)p1;
				llq = (__int64 *)p2;
				for(j = 0; j < size; j += sizeof(__int64))
					*llp++ = *llq++;
				break;
			case 6:
				dp = (double *)p1;
				dq = (double *)p2;
				for(j = 0; j < size; j += 4*sizeof(double)) {
					*dp++ = *dq++;
					*dp++ = *dq++;
					*dp++ = *dq++;
					*dp++ = *dq++;
				}
				break;
			}
			if(fflag == 1) {
				free(p1);
				free(p2);
			}
			if(!sflag) {
				tend();
				t = tval();
				tottim += t;
				if(t == 0.0)
					t = .0001;
				printf(" %8.6f seconds %8.3f MB/s\n",
					t,
					(double)size/t/1000000.);
			}
		}
		if(sflag) {
			tend();
			tottim = tval();
		}
		if(csvflag) {
			printf("%s,%u,%u,%8.3f,%8.3f\n",
				methods[method],size,size*cnt,tottim,
				(double)size/(tottim/cnt)/1000000.);
		}
		else {
			(void)printf("\tAVG: %d %-18.18s\t", size, methods[method]);
			(void)printf(" %8.3f MB/s\n",
					(double)size/(tottim/cnt)/1000000.);
		}
		tottim = 0.0;
	}
      



关于作者

Dr. Edward G. Bradford has authored this article




对本文的评价










回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款