闲着无聊写了两个内存复制的函数,不运行测试猜猜哪个更快,为什么你认为你所选的会更快

Sandrer 2014-03-24 08:19:19
void *memcpy1(void *dst, const void *src, size_t size)
{
void *ret = dst;

while (size--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}

return ret;
}


void *memcpy2(void *dst, const void *src, size_t size)
{
void *ret = dst;

size_t block = size / 4;

while (block--)
{
*(int *)dst = *(int *)src;
dst = (int *)dst + 1;
src = (int *)src + 1;
}

size_t mod = size % 4;
if (mod)
{
while (mod--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
}

return ret;
}
...全文
156 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
linktothepast 2014-03-30
  • 打赏
  • 举报
回复
你都还没有判断src 和dst 是否对齐呢
这不是鸭头 2014-03-25
  • 打赏
  • 举报
回复
__cc__ 2014-03-25
  • 打赏
  • 举报
回复
引用 楼主 Sandrer 的回复:
void *memcpy1(void *dst, const void *src, size_t size)
{
    void *ret = dst;

    while (size--)
    {
        *(char *)dst = *(char *)src;
        dst = (char *)dst + 1;
        src = (char *)src + 1;
    }

    return ret;
}
void *memcpy2(void *dst, const void *src, size_t size)
{
    void *ret = dst;

    size_t block = size / 4;

    while (block--)
    {
        *(int *)dst = *(int *)src;
        dst = (int *)dst + 1;
        src = (int *)src + 1;
    }

    size_t mod = size % 4;
    if (mod)
    {
        while (mod--)
        {
            *(char *)dst = *(char *)src;
            dst = (char *)dst + 1;
            src = (char *)src + 1;
        }
    }

    return ret;
}
AVX更快,一次128字节。
xiaohuh421 2014-03-25
  • 打赏
  • 举报
回复
*(int *)dst = *(int *)src; 这种东西可能会影响效率, 已经影响测试效果了. 按理来说, 应该是按4字节复制更快些, 因为一般32位系统中都是4字节对齐处理快于单字节. 当然还有64位复制, 或者更快的MMX指令.
yaozhiyong110 2014-03-25
  • 打赏
  • 举报
回复
猜第二个 因为第一个太常规
杀意已决 2014-03-25
  • 打赏
  • 举报
回复
猜第二个 .
hemmingway 2014-03-24
  • 打赏
  • 举报
回复
看看这个



void *memcpy_optimized(void *dst, const void *src, size_t sz)
{
	void *r = dst;

	//先进行uint64_t长度的拷贝,一般而言,内存地址都是对齐的,
	size_t n = sz & ~(sizeof(uint64_t) - 1);
	uint64_t *src_u64 = (uint64_t *) src;
	uint64_t *dst_u64 = (uint64_t *) dst;

	while (n)
	{
		*dst_u64++ = *src_u64++;
		n -= sizeof(uint64_t);
	}

	//将没有非8字节字长取整的部分copy
	n = sz & (sizeof(uint64_t) - 1);
	byte *src_u8 = (byte *) src;
	byte *dst_u8 = (byte *) dst;
	while (n-- )
	{
		(*dst_u8++ = *src_u8++);
	}

	return r;

	return NULL;
}

laviewpbt 2014-03-24
  • 打赏
  • 举报
回复
够无聊,这个东西的优化都是靠SSE,AVX等指令的、

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧