gpt4 book ai didi

c - memcpy 和 memmove 的意外性能

转载 作者:行者123 更新时间:2023-12-02 03:44:09 33 4
gpt4 key购买 nike

为什么 memcpy 在我的系统上比 memmove 执行得慢?

来自阅读其他 SO 问题,例如 thisthis给人的印象是 memcpy 应该比 memmove 工作得更快,从直觉上来说,应该是这样的。毕竟,memcpy 的检查较少,手册页也与他们所说的相符。

然而,当测量每个函数内部花费的时间时,memmove 胜过 memcpy!更重要的是,它似乎也击败了 memset,当 memset 似乎可以从 memcpy 或 memmove 不能的优化中受益时。为什么会这样?

我电脑上的结果(其中之一):

[INFO] (ex23.c:151 func: main) Normal copy: 109092
[INFO] (ex23.c:198 func: main) memcpy: 66070
[INFO] (ex23.c:209 func: main) memmove: 53149
[INFO] (ex23.c:219 func: main) memset: 52451

用于给出此结果的代码:

#include <stdio.h>
#include <string.h>
#include "dbg.h" // debugging macros
#include <time.h>

int main(int argc, char *argv[])
{
char from[10000] = {'a'};
char to[10000] = {'c'};
int rc = 0;
struct timespec before;
memset(from, 'x', 10000);
memset(to, 'y', 10000);

clock_gettime(CLOCK_REALTIME, &before);

// naive assignment using a for loop
normal_copy(from, to, 10000);
struct timespec after;
clock_gettime(CLOCK_REALTIME, &after);
log_info("Normal copy: %ld", (after.tv_nsec - before.tv_nsec));


memset(to, 'y', 10000);
clock_gettime(CLOCK_REALTIME, &before);
memcpy(to, from, 10000);
clock_gettime(CLOCK_REALTIME, &after);
log_info("memcpy: %ld", (after.tv_nsec - before.tv_nsec));

memset(to, 'y', 10000);
clock_gettime(CLOCK_REALTIME, &before);
memmove(to, from, 10000);
clock_gettime(CLOCK_REALTIME, &after);
log_info("memmove: %ld", (after.tv_nsec - before.tv_nsec));

memset(to, 'y', 10000);
clock_gettime(CLOCK_REALTIME, &before);
memset(to, 'x', 10000);
clock_gettime(CLOCK_REALTIME, &after);
log_info("memset: %ld", (after.tv_nsec - before.tv_nsec));

return 0;
}

最佳答案

正如@Carl Norum 和@Greg Hewgill 所说:缓存效果。

您肯定会遇到缓存内存的影响。重新安排您的测试并比较结果。当我在 memmove() 之前和之后测试 memcpy() 时,第二个 memcpy() 表现得像 memove() 并且也比第一个 memcpy() 更快。​​

关于c - memcpy 和 memmove 的意外性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18176857/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com