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

时间:2014-07-26 01:42:31

标签: c performance x86 memcpy strcpy

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

如果我正确记得i386汇编程序,则会有loop个指令复制给定数量的字节或单词。所以它是最快的方式,而strcpy() i386汇编程序实现将在普通循环中使用'\0'的手动检查。

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

其他架构是什么?

2 个答案:

答案 0 :(得分:22)

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

...然而

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

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

答案 1 :(得分:10)

在几乎任何平台上,复制相同数量的字节时,memcpy()将比strcpy()更快。当字符串的最大允许大小远大于其实际大小时,strcpy()或其任何“安全”等价物的唯一时间将优于memcpy()。如果一个缓冲区可以容纳一个最多一百万个字符的字符串,并且想要将该字符串复制到另一个百万字节的缓冲区,那么即使第一个字符串中的字符串,memcpy()也必须复制一百万个字节。缓冲区只有两个字符长。但是,strcpy()函数或其等价函数可以提前退出,并且复制两个字符可能比memcpy()复制一百万字符所需的时间更短。