需要很长时间

  • 本文关键字:长时间 c++ strncpy
  • 更新时间 :
  • 英文 :


我最近遇到了一些遗留代码,并注意到有时(并非总是(以下代码片段需要很长时间才能执行。

#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);

相关内容

  • 没有找到相关文章

最新更新