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);
	}
}


'C언어' 카테고리의 다른 글

suggest parentheses around assignment used as truth value  (0) 2014.06.11
valgrind test  (0) 2014.06.03
C언어 고급기능  (0) 2014.02.20
GNU LIB 관련 링크  (0) 2014.01.28
LC_ALL=C  (0) 2013.11.13