Уже не первый раз попадаюсь на утверждение, что strlen() в линуксовом glibc оптимизирована, а у BSD нет. Утверждение «подтверждается» ссылками в соответствующие репозитории:

  1. strlen() в glibc
  2. strlen() в OpenBSD

Посмотрите какой длинный оптимизированный код у glibc и какой обычный тупой у BSD! Вот они, в перевернутом виде:

strlen.png

Появляется еще один аргумент о превосходстве Линукса над BSD! Ура!

И так пока какой-нибудь чел (вроде меня) не полазает по репозиториям и не скажет, что ни та, ни другая версия не используется во многих архитектурах. Достаточно посмотреть, например, в sysdeps/i386/strlen.c в glibc:

    size_t
    strlen (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;
    }

и в arch/i386/string/strlen.S в OpenBSD:

    ENTRY(strlen)
        pushl   %edi
        movl    8(%esp),%edi        /* string address */
        cld             /* set search forward */
        xorl    %eax,%eax       /* set search for null terminator */
        movl    $-1,%ecx        /* set search for lots of characters */
        repne               /* search! */
        scasb
        notl    %ecx            /* get length by taking complement */
        leal    -1(%ecx),%eax       /* and subtracting one */
        popl    %edi
        ret

или в i386/string/strlen.s в Apple’овской libc (где используется SSE3, тут приводить не буду, кликайте ссылку).

Не повторяйте этот миф, пожалуйста.