GN⁺: Krep - grep 보다 5배 빠른 문자열 검색 도구
(davidesantangelo.github.io)- 성능이 중요한 애플리케이션을 위해 C로 작성된 초고속 문자열 검색 도구
- 패턴 특성과 하드웨어에 따라 최적의 알고리듬을 동적으로 선택
- SSE4.2/AVX2 같은 하드웨어를 활용하여 최대 처리량을 제공
- 대용량 지원을 위해 파일을 청크로 나눠 멀티스레딩 병렬 처리
- 패턴에 따라 가장 적합한 검색 알고리듬 사용
- Boyer-Moore-Horspool: 일반적인 패턴 매칭에 적합
- Knuth-Morris-Pratt (KMP) 알고리즘: 짧은 패턴에 최적화
- Rabin-Karp: 긴 패턴에 효과적
- SIMD 가속: SSE4.2, AVX2 지원 하드웨어에서 성능 향상
- 메모리 매핑 파일 I/O 사용으로 시스템 호출을 최소화해 처리량 극대화
-
유연한 검색 옵션
- 대소문자 구분 및 구분 없는 검색
- 파일 검색 외에 직접 문자열 검색 가능
- 일치 횟수만 출력하는 모드 제공
사용 방법
krep [OPTIONS] PATTERN [FILE]
- 로그 파일에서 “error” 검색 :
krep "error" system.log
- 대소문자 구분 없이 8개의 스레드 사용해 검색:
krep -i -t 8 "ERROR" large_logfile.log
- 일치 횟수 출력 (매칭된 줄은 출력하지 않음):
krep -c "TODO" *.c
- 파일이 아닌 문자열에서 직접 검색:
krep -s "Hello" "Hello world"
명령줄 옵션
- -i : 대소문자 구분 없이 검색
- -c : 매칭된 줄 출력 없이 일치 횟수만 출력
- -t NUM : NUM 개의 스레드 사용 (기본값: 4)
- -s STRING : 파일이 아닌 문자열에서 검색
- -v : 버전 정보 출력
- -h : 도움말 출력
벤치마크
-
krep
의 성능은 일반적인 문자열 검색 도구와 비교해 매우 뛰어남.- krep은 1GB 텍스트 파일에서 일반적인 패턴을 검색하는 데 0.78초가 걸렸으며, 이는 초당 1,282MB의 속도를 의미함
- grep은 같은 작업에 2.95초가 걸렸으며, 초당 339MB의 속도를 기록함
- ripgrep은 1.48초가 걸렸으며, 초당 676MB의 속도를 보임
-
→
krep
은grep
보다 약 3.8배 빠르고,ripgrep
보다 약 1.9배 빠름 (하드웨어 및 파일 특성에 따라 성능이 달라질 수 있음)
이름의 유래
- “krep” 은 아이슬란드어 **“kreppan”**에서 유래함
- “빠르게 움켜잡다”는 뜻을 가짐
- 효율적인 패턴 인식을 상징함
- 짧고 간결한 명령어로 타이핑이 용이함
정규식 지원을 버리고서 ripgrep보다 2배밖에 빠르지 못하면 활용도가 좀 낮긴 하네요.
저는 그냥 정규식 되는 ripgrep을 계속 쓸 것 같아요.
Hacker News 의견
-
CPU 기능(예: AVX2)은 런타임에서 감지되어야 함
- ifdef는 컴파일러가 지원하는지 빌드 타임에만 감지함
- 프로그램은 컴파일러가 AVX2를 지원할 때만 컴파일됨
- 런타임에서 CPU가 AVX2를 지원하는지 확인해야 함
- 프로젝트에서 "구성 시간에 CPUID 플래그와 실제 명령어 실행 테스트를 통해 감지"라는 부분이 있음
- SSE4.2와 AVX2 명령어를 자동으로 활용할 수 있음
-
krep 프로젝트에 대한 블로그 게시물 소개
- 홈페이지에서 ripgrep보다 빠르다고 나옴
- 전체 ripgrep 벤치마크와 비교해보고 싶음
- madvise() 관련 오류 발생, Makefile의 CFLAGS에 '-D_GNU_SOURCE' 추가 필요
-
테스트 케이스의 중요성
- 멀티스레드 파일 검색에서 청크 경계 문제는 신경 쓰임
- 단순 검색에 새로운 엣지 케이스를 도입함
- 파일에 한 글자를 추가하면 매치가 깨질 수 있음
-
빌드 문제 해결 후 벤치마크 결과
- 첫 번째 벤치마크 시도에서 속도가 느림
- ripgrep이 krep보다 1.52배 빠름
-
매치 빈도가 높은 벤치마크 시도
- krep이 ripgrep보다 3.40배 빠름
- 매치 수가 크게 차이남
- krep이 정확한 결과를 제공하지 않을 수 있음
-
추가 벤치마크 시도
- ripgrep이 특정 패턴을 찾는 데 더 빠름
- krep이 매치를 찾지 못함
-
ripgrep의 알고리즘과 메모리 맵 사용
- ripgrep은 고급 서브스트링 검색 알고리즘 사용
- 메모리 맵과 병렬 처리 사용
- krep도 병렬 처리 사용, 단일 파일 검색 시 멀티스레드 사용
-
벤치마크 결과에 대한 의문
- ripgrep이 5GB 파일에서 패턴 검색 시 40초 이상 걸린다는 것은 이상함
- OP에게 벤치마크 재현 방법 요청
-
krep의 이름에 대한 의견
- grep의 "re"는 정규 표현식을 의미함
- krep은 정규 표현식을 사용하지 않으므로 이름이 잘못된 것일 수 있음