关于memcpy的优化问题!

发布于 2022-07-19 09:36:38 字数 617 浏览 11 评论 2

问题描述:
#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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

折戟 2022-07-20 22:52:14

恩,俺查了一下
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中找到定义,是用汇编语言写的,估计也是做了优化的。

三寸金莲 2022-07-20 17:31:30

建议你去看看内核中和glibc中memcpy()的实现。在内核中,memcpy()有针对拷贝内存中的数据类型,cpu是否用3DNOW技术,拷贝数据量 选择不同的拷贝方式。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文