첫번째 어프로치 :

inline long radix( const char* buf, const int mul )

{

    if( mul == 1 )

        return  *buf & 0xF;

    return  ( *buf & 0xF ) * mul + radix( buf + 1, mul / 10 );

}


요즘 컴파일러가 상수 재귀를 얼마나 잘 정리하는지 테스트 해봤는데

결과는 3배 느림. 그냥 꼬리재귀 정도만 먹고 루프를 도는듯




두번째 어프로치 :

inline long ascDec( const char* s )

{

    return  ( s[  0 ] - '0' ) * 1000000000 + ( s[  1 ] - '0' ) * 100000000 +

            ( s[  2 ] - '0' ) *   10000000 + ( s[  3 ] - '0' ) *   1000000 +

            ( s[  4 ] - '0' ) *     100000 + ( s[  5 ] - '0' ) *     10000 +

            ( s[ 12 ] - '0' ) *       1000 + ( s[ 13 ] - '0' ) *       100 +

            ( s[ 14 ] - '0' ) *         10 + ( s[ 15 ] - '0' );

}


inline long getHeadLen( const char *out ) 

{

    return  ascDec( out + 6 );

}


SIMD를 쓰지 않는 이상 성능 최적화는 쉽지 않다는 판단하에 늘어선걸 정리하고 inline 화.

다른 곳에서 쓸 수 있도록 offset 을 0 부터 출발하게 맞추고 함수명을 일반화.

대신 헤드의 길이를 가져오는 함수를 따로 구현하여서 거기서 offset 주소를 추가.

성능은 inline 때문에 오히려 증가했고 재사용성을 높였음.

깔끔한 줄 맞춤으로 니 코드 보단 보기 좋지.

이상.


long getHeadLen(uint8 *out) 

{

return ((out[6] -'0') *1000000000+

 (out[7] -'0') *100000000+

 (out[8] -'0') *10000000+

 (out[9] -'0') *1000000+

 (out[10]-'0') *100000+

 (out[11]-'0') *10000+

 (out[12]-'0') *1000+

 (out[13]-'0') *100+

 (out[14]-'0') *10+

 (out[15]-'0'));

}