首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Windows上优化memcpy (MSVC++)

在Windows上优化memcpy (MSVC++)
EN

Stack Overflow用户
提问于 2020-08-24 13:55:47
回答 3查看 410关注 0票数 0

假设我想复制# no号。从一个数组到另一个数组的整数。我发现以下3项的性能是不同的,尽管它们完成了相同的任务:

代码语言:javascript
复制
memcpy((char*)(arr), (char*)(temp), sizeof(int) * size);
memcpy((int*)(arr), (int*)(temp), size);
memcpy((double*)(arr), (double*)(temp), size/(sizeof(double)/sizeof(int)));

计时时间分别为160、40和20 (1百万整数)。我知道在每种情况下寄存器的使用都是不同大小的,但是我期望MSVC编译器使用最高(向量)寄存器大小来优化所有这些。内存对齐可以通过创建剥离循环和剩余循环来实现。此外,还有可能使用非时态/流存储。在编译器中有强制这种优化的方法吗?

另外,在MSVC中有什么办法强制备忘录内衬吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-08-24 14:00:39

memcpy总是复制字节,而您似乎认为它复制了您传递的类型(intdouble)。来自优先选择

字节从src指向的对象复制到dest指向的对象。这两个对象都被重新解释为无符号字符数组。

由于您的三个调用确实复制了不同数量的字节,因此运行时的差异是预期的。如果sizeof(int) == 4double是平台上int大小的两倍,则所测量的时间是一致的。

票数 2
EN

Stack Overflow用户

发布于 2020-08-24 13:59:16

即使他们完成了同样的任务

不,那不是真的。

memcpy的最后一个参数是长度,以字节()为单位的,而不是项目数。你的第二行的工作量少了四倍,只复制了你想要的四分之一(或者第一行拷贝了四倍)。

票数 2
EN

Stack Overflow用户

发布于 2020-08-24 14:11:42

其他答案很好地解释了这个问题,我只想补充一些数字来澄清:

代码语言:javascript
复制
memcpy((char*)(arr), (char*)(temp), sizeof(int) * size);

第一个调用复制可能是4 * size 字节sizeof(int) * size字节。它需要160微秒

代码语言:javascript
复制
memcpy((int*)(arr), (int*)(temp), size);

第二个调用复制size 字节,因此可以减少4倍的时间,也可以节省4倍的时间,即160/4 = 40微秒

代码语言:javascript
复制
memcpy((double*)(arr), (double*)(temp), size/(sizeof(double)/sizeof(int)));

第三个调用复制size/(sizeof(double)/sizeof(int))字节(很可能是size/(8/4) ),因此复制字节。这比第一和第二种情况分别少8倍和2倍。它需要160/8 = 40/2 = 20微秒

因此,运行时与复制的字节数成正比。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63562504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档