我最近遇到了一些遗留代码,并注意到有时(并非总是(以下代码片段需要很长时间才能执行。
#define NUM_OF_RECORDS 100000
char* pzBuffer = new char[NUM_OF_RECORDS + 1];
strncpy(pzBuffer, "", NUM_OF_RECORDS);
目标似乎是初始化 pzBuffer,我同意 memcpy 或 memset 将是更好的选择。我试图弄清楚为什么需要时间以及这里的用法是否正确。
由于以下原因,使用memset()
可以做得更好:
1( strncpy()
在单独的"char"级别工作,这意味着它将逐个迭代所有字符(在您的情况下~NUM_OF_RECORDS
迭代(。
2( memset()
在块级别工作,其中块由 N 个字节组成。虽然这意味着遍历块的各个字节,但此函数专为优化大块大小而设计,当涉及大块时,这通常会导致更好的性能。
我建议创建代码的变体 1(使用 memset 2(其他与 strncpy。然后,编译它们以生成汇编代码,并找出指令之间的差异。
http://unix.superglobalmegacorp.com/BSD4.4Lite/newsrc/libkern/strncpy.c.html
像 strncpy 的标准实现这样的 lok 无论如何都会用零填充数组的所有剩余元素。所以,这样做需要时间。
do {
if ((*d++ = *s++) == 0) {
/* NUL pad the remaining n-1 bytes */
while (--n != 0)
*d++ = 0;
break;
}
} while (--n != 0);