C언어
memchr vs strchr
고요한하늘...
2014. 4. 15. 17:46
str 계열 함수들은 NULL 문자를 체크해야 한다.
C언어에서 문자열은 기본적으로 문자열의 마지막을 '\0'으로 표시하기 때문이다.
수백만번의 strchr대신 memchr로 바꾸면 속도가 향상될까 하는 호기심에 테스트를 해봤더니 별다른 속도 차이가 없었다.
이유는 이 두함수의 원형을 살펴보면 대략적인 힌트를 알수 있다.
void* memchr( const void *s, int c, size_t n )
char* strchr( const char *p, int ch )
memchr은 strchr에는 없는 문자열 길이를 입력으로 넣어야 한다.
strchr함수는 '\0'문자를 지속적으로 체크하는 대신 memchr은 넘어온 길이가 0인지를 지속적으로 체크해야 한다.
결과적으로 결과는 대동소이
void* memchr(const void *s, int c, size_t n) {
const unsigned char *pc = (unsigned char *) s;
for (;n--;pc++)
if (*pc == c)
return ((void *) pc);
return 0;
}
char *strchr(const char *p, int ch)
{
char c;
c = ch;
for (;; ++p) {
if (*p == c)
return ((char *)p);
if (*p == '\0')
return (NULL);
}
}