VC++ 2015 release mode 에서 비교.


10만 바이트 스트링 (1 ~ 255 순환) 을 10000번 돌린 최소값의 클럭수




32비트 컴파일에서 (내 운영체제는 64비트) 37600 클럭 소요




64비트 컴파일러에서 18912 클럭 소요



이거보다 빠른 strlen 만든 사람 피자 쏨.


(내 PC 에서도 빨라야됨)




아래는 테스트 코드


#include <cstdio>

#include <stdlib.h>

#include <string.h>

#include <intrin.h>


size_t strlen_ex(char* s); // to do


#define LEN        99999

#define STRLEN     (LEN+1)

#define LOOP_COUNT 50000


int main()

{

    char temp[STRLEN];

    for (int i = 0; i < LEN; ++i) temp[i] = i % 255 + 1;

    temp[LEN] = 0;


    size_t len1, len2;

    unsigned long long begin1, begin2, min1, min2, end1, end2, base;

    base = min2 = min1 = -1LL;


    for (int i = 0; i < 100; ++i)

    {

        begin1 = __rdtsc();

        end1 = __rdtsc();

        if (base > end1 - begin1) base = end1 - begin1;

    }


    int strlen_win = 0;

    int strlen_ex_win = 0;

    for (int i = 0; i < LOOP_COUNT; ++i)

    {

        begin1 = __rdtsc();

        len1 = strlen(temp);

        end1 = __rdtsc();

        temp[LEN] = 0;

        begin2 = __rdtsc();

        len2 = strlen_ex(temp);

        end2 = __rdtsc();

        temp[LEN] = 0;

        if (end1 - begin1 < min1) min1 = end1 - begin1;

        if (end2 - begin2 < min2) min2 = end2 - begin2;

    }


    printf("strlen    u u clock ",

        (unsigned int)len1, (unsigned int)(min1 - base));

    printf("strlen_ex u u clock ",

        (unsigned int)len2, (unsigned int)(min2 - base));

    system("pause");


    return 0;

}