라이브러리 함수가 따로 없길래
char * stristr(const char *pszSrc, const char *pszSearch)
{
if (pszSrc && pszSearch) { // api 등은 특정 스트링란에 필요없는 경우 NULL 전달하는 경우가 많으므로 체크 필요
const char *s, *sub;
for (; *pszSrc; pszSrc++) {
for (sub = pszSearch, s = pszSrc; *sub && *s; sub++, s++) {
char ms, msub; // 소문자의 경우 대문자 값을 받기 위한 변수
if (*s >= 'a' && *s <= 'z') { ms = *s - 0x20; }
else { ms = *s; }
if (*sub >= 'a' && *sub <= 'z') { msub = *sub - 0x20; }
else { msub = *sub; }
if (ms != msub) break;
}
if (*sub == 0) return (char *)pszSrc;
}
}
return NULL;
}
인터넷에서 긁어온 위 함수랑 strstr을 돌려서 37메가짜리 txt파일을 끝까지 읽는데 걸리는 시간을 재봤는데
strstr은 3ms정도 걸리고 저 함수는 80ms정도 걸립니다.
약 25배 이상 느린데 저런 큰 텍스트 뭉텅이를 모조리 소문자로 바꿔서 strstr 돌리는것도 뭔가 아닌거같고
뭐 어케해야될까요..
너무 어렵네요
아이유 이쁜 짤 올려주면 고민해줌.
모조리 소문자로 바꾸는거 나쁜 생각 아닌데? ㅋㅋ
ㄴ제친구가 아이유 엄청난 팬인데 전 아니라 짤이 없네요.. 할거없어서 닉 저리한거임
그럼 EXID.하니 이쁜 짤 올려주면 고민해줌.
흠 원본문자열 저장해놔야되는데 그럼 메모리를 2배로 먹네요
그냥 뺀다음 차이가 32만큼만 나는지 비교하면 되는거아님?
일단 문자열 비교 알고리즘은 저것 보다 좋은게 훨 많구 if 문 보단 256 바이트 짜리 배열 참조 한방이 쌀 것 같지 않아유? 그리고 꼭 2배가 되어야 하는건 아니지유~ 상대적으로 작은 비교문자열 길이에 달린거임.
가령 미리 대문자를 소문자로 바꾸어 둔 치환 테이블을 거치면 if ~~ 필요 없잖아유 lower_ascii[] = { .... 'a', 'b', 'c', .... 'a', 'b', 'c', ... };
256바이트짜리 배열 참조가 무슨 뜻인지 모르겠어요 글고 구글링해보니 보이어 무어 알고리즘 돌린것보다 strstr이 훨 빠르게 나오던데
a~z a~z 이렇게 해서 256바이트만큼 채우고 그만큼 쓴다는뜻인가 아 모르겠네요
그니까 strstr 을 그대로 쓰는게 나을테고 그걸 어떻게 돌리느냐가 관건인데,
그냥 저 두 문자열 통째로 xor한다음 바이트씩 끊어서 1비트가 32말고도 있는지 비교하면 적절할거같은데
(왜냐하면 intrinsic 으로 최적화 되어 있을테니까 - 이거 따라잡으려면 손품 좀 팔아야됨)
ms = lower_ascii[*s]; 로 끝나게 하라는거쥬 ㅋㅋ
if 문 필요없게 말이여유.
부분 문자열은 어차피 미리 결정인데 첨부터 대문자나 소문자로 통일해두면 되지 저게 뭔짓이유?
전체 루프 안에서 부분문자열 의 대소문자 변환을 하고 있다는건 미친짓이지유.
짤받았으니 코딩해야징
ms = lower_ascii[*s]; 이게 먼의미졍..
위의 코드에서 소스 문자열 중에 한 문자를 *s 로 가져와 알파벳 구간인지 체크하고 있죠?
그냥 strstr 쓰라고 하시지 않음?
char lower_ascii[256] = { 0, 1, 2, .... 'a', 'b', 'c', .... 'a', 'b', 'c'... }; 이렇게 대문자 ABC 구간도 소문자로 바꾼 배열을 미리 만들어 놓고,
lower_ascii 배열에 원래의 문자를 집어 넣으면 다 소문자로 바뀐 값이 나올거잖아유~
strstr 쓰려면 대소문자를 맞춰줘야 하니까 맞추는 작업은 해야쥬~
만약에 원본에 기호가 그닥 없다면 4바이트 단위로 마스킹을 해버려도 되지만 ㅋㄷ