关于memcpy的优化问题!
问题描述:
#define DATALEN 1000
#define DUMPCOPY for(i=0; i<DATALEN; i++){destination[i] = source[i];}
#define SMARTCOPY memcpy(destination, source, DATALEN)
main()
{
char source[DATALEN], destination[DATALEN];
int i, j;
for(j=0; j<100; j++){
SMARTCOPY;// or DUMPCOPY
}
}
上述程序,分别调用SMARTCOPY和DUMPCOPY。
运行时间分别为(硬件配置:CPU 600MHz,缓存128K,内存256;软件配置:Redhat 9.0-2.40.8-20内核)
SMARTCOPY:0.009s
DUMPCOPY: 0.059s
是何原因,请指教!多谢!:)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
恩,俺查了一下
glibc中的memcpy是做了优化的!
至于内核中的memcpy,我找到了两个地方,不清楚在内核中调用memcpy,用的是哪一个:
一个是/usr/src/linux-2.4/lib/string.c中的,如下:
396 * memcpy - Copy one area of memory to another
397 * @dest: Where to copy to
398 * @src: Where to copy from
399 * @count: The size of the area.
400 *
401 * You should not use this function to access IO space, use memcpy_toio()
402 * or memcpy_fromio() instead.
403 */
404 void * memcpy(void * dest,const void *src,size_t count)
405 {
406 char *tmp = (char *) dest, *s = (char *) src;
407
408 while (count--)
409 *tmp++ = *s++;
410
411 return dest;
412 }
这个地方的未做优化。
二是经过宏替换转移到__memcpy,后在/include/asm-i386/string.h中找到定义,是用汇编语言写的,估计也是做了优化的。
建议你去看看内核中和glibc中memcpy()的实现。在内核中,memcpy()有针对拷贝内存中的数据类型,cpu是否用3DNOW技术,拷贝数据量 选择不同的拷贝方式。