如何有效地计算C中字符串的长度?

Car*_*rez 21 c string performance

如何有效(及时)计算C中字符串的长度?

现在我正在做:

int calculate_length(char *string) {
    int length = 0;
    while (string[length] != '\0') {
        length++;
    }
    return length;
}
Run Code Online (Sandbox Code Playgroud)

但是与strlen()相比它很慢,例如,有没有其他方法可以做到这一点?

谢谢.

编辑:我在一个独立的环境中工作,我不允许使用任何外部库,包括"string.h".

And*_*mar 43

FreeBSD源代码:

size_t
strlen(const char *str)
{
    const char *s;
    for (s = str; *s; ++s);
    return(s - str);
}
Run Code Online (Sandbox Code Playgroud)

与您的代码相比,这可能非常好地映射到汇编指令,这可以解释一个很大的性能差异.


Sud*_*shu 9

看一下标准libc中strlen的源代码.标准库中的函数通常是高度优化的.在这里查看(在汇编中编码) - 这是来自GNU libc.

size_t
DEFUN(strlen, (str), CONST char *str)
{
  int cnt;

  asm("cld\n"                   /* Search forward.  */
      /* Some old versions of gas need `repne' instead of `repnz'.  */
      "repnz\n"                 /* Look for a zero byte.  */
      "scasb" /* %0, %1, %3 */ :
      "=c" (cnt) : "D" (str), "0" (-1), "a" (0));

  return -2 - cnt;
}
Run Code Online (Sandbox Code Playgroud)

  • 程序集版本可能更快,但您需要一些数字来备份该声明.见http://leaf.dragonflybsd.org/mailarchive/commits/2011-11/msg00195.html (3认同)

aib*_*aib 9

strlen().可能的情况是,如果有人找到了更好,更快的通用方法,那么strlen就会被替换掉.


Mic*_*urr 6

看看GNU C库的strlen()源代码.

它使用了许多非显而易见的技巧来提高速度而不会降低到装配,包括:

  • 找到一个正确对齐的角色
  • 将字符串的那些对齐部分读入int(或更大的数据类型),一次读取几个字符
  • 使用bit twiddling技巧来检查嵌入在该chars块中的其中一个字符是否为零

等等