c - memcpy() 通常比 strcpy() 快吗?

标签 c performance x86 memcpy strcpy

memcpy() 通常比 strcpy() 快吗(在大多数真实平台上)? (我假设字符串的大小是已知的。)

如果我没记错的话,i386 汇编器中有 loop 指令复制给定数量的字节或单词。所以这是最快的方法,而 strcpy() i386 汇编程序实现将在普通循环中使用手动检查 '\0'

所以我觉得在 x86 上 memcpy()strcpy() 快。

其他架构呢?

最佳答案

如果您知道要复制的数据的大小,那么 memcpy() 应该与 strcpy() 一样快或更快。否则,memcpy()不能单独使用,strcpy()应该和strlen()后面跟着memcpy()

然而...

许多 memcpy() 和/或 strcpy() 和/或 strlen() 的实现旨在有效地处理大数据量。这通常意味着额外的启动开销(例如确定对齐方式、设置 SIMD、缓存管理等)并使这些实现对于复制少量数据(这在编写良好的代码中更有可能)变得不好(慢)。因此,“应该一样快或更快”并不一定意味着“一样快或更快”。例如,对于少量数据,针对大量数据优化的 memcpy() 可能比未针对大量数据优化的 strcpy() 慢得多数据。

另请注意,这里的主要问题是通用代码(例如 memcpy()strcpy())无法针对特定情况进行优化。最好的解决方案是具有多种功能 - 例如memcpy_small() 针对复制少量数据进行了优化,memcpy_large() 针对失败的错误代码进行了优化,避免了复制大量数据。

关于c - memcpy() 通常比 strcpy() 快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24966693/

相关文章:

python - 如何让 cProfile 只打印重要的功能?

performance - Magic committer 没有提高 Spark3+Yarn3+S3 设置中的性能

c - 气体组件 x86。将字符转换为二进制字符串

linux - 是否有与 Linux 内核的 alternative() 宏等效的用户空间?

c - 我如何用指针组织我的数组,而不使用 [] 运算符

c++ - 我可以使用输出作为 #define 中的参数吗

c - 易C : Program stuck after asking for prompt

javascript - 在 IE6 中创建具有 5000 个选项的选择标签的最快方法是什么?

multithreading - 多核 CPU 上能否真正同时执行 2 条指令

c - Makefile,clang OK,gcc错误