오래전 1.6, 1.4와 라이브러리간 성능지표를 보고..
일단 결론부터 이야기 하자면 Java1.8의 Matcher는 빠르다.
허무하지만 이 결론을 내게 된 계기가 있다.
내가 하고 있는 일 중에 App Crash Log를 수집해서 분석하는 업무가 있다.
이게 NHN에선 ncrazer라는 시스템이고, skplant에선 crash logger 라 불리고 우린 "MOCA"라고 부른다.
앱의 환경이 다르다보니 여러 Crash가 나도 결국 같은 이유로 인해 발생하는 것들이 꽤 많다. 해서 Crash를 보여줄 때 이래저래 가공을 해서 중복을 제거한다거나 유사도 측정을 하는데 이때 많은 정규식들을 가지고 Crash 정보를 nomalization하는데 사용한다.
해서 이래저래 성능테스트를 하다가 정규식 부분을 좀 더 빠르게 해보고 싶어서 여러 문서를 보다가
Java Regular expression library benchmarks 라는 문서를 찾게되었다.
저 링크를 따라가서 문서를 보면 알겠지만 해당 문서는 꽤 오래전 문서다. java SDK 비교 대상이 1.6.X이기 때문이다. 현재 우리는 java 1.8을 쓰고 있어서 성능을 다시 한번 확인 할 필요가 있었다.
일단 perl의 regex가 된다고 한 라이브러리
jregex.Pattern , "org.apache.oro.text.regex.Perl5Matcher"로 해봤다.
Test String Value
"0 CoreFoundation 0x00000001829f1458 0x1829ec000 21592 0"
Test Regex
"(^\\d+)\\s+(\\S.*?)\\s+(0x\\w+)\\s+(0x\\w+)\\s+"
테스트는 Pattern Compile은 끝낸 상태에서 Matcher만 수행해봤고 결과는 다음과 같다.
loop count : 1,000
----------------------------------------------
java 1.8 = 10 (ms)
jregex.Pattern = 25 (ms)
perl5Matcher = 15 (ms)
loop count : 10,000
----------------------------------------------
java 1.8 = 38 (ms)
jregex.Pattern = 61 (ms)
perl5Matcher = 74 (ms)
loop count : 100,000
----------------------------------------------
java 1.8 = 363 (ms)
jregex.Pattern = 232 (ms)
perl5Matcher = 202 (ms)
loop count : 1,000,000
----------------------------------------------
java 1.8 = 1085 (ms)
jregex.Pattern = 1220 (ms)
perl5Matcher = 1339 (ms)
결과를 보면 알겠지만.. 100,000건 구간은 java보단 다른 regex가 빠르다.
그 외에는 거의 비등비등한 수준이란 걸 알 수 있다.
다음 테스트는 Pattern Complier와 Matcher를 같이 수행하였다.
loop count : 1,000
----------------------------------------------
java 1.8 = 35 (ms)
jregex.Pattern = 131 (ms)
perl5Matcher = 57 (ms)
loop count : 10,000
----------------------------------------------
java 1.8 = 133 (ms)
jregex.Pattern = 229 (ms)
perl5Matcher = 209 (ms)
loop count : 100,000
----------------------------------------------
java 1.8 = 579 (ms)
jregex.Pattern = 595 (ms)
perl5Matcher = 510 (ms)
loop count : 1,000,000
----------------------------------------------
java 1.8 = 2118 (ms)
jregex.Pattern = 2730 (ms)
perl5Matcher = 3948 (ms)
두번째 결과도 라이브러리간 성능차이가 거의 없다고 본다.
비교 대상에서 제외한 다른 라이브러리들의 경우 정규식 문법이 다르거나 제대로 정규식이 동작하지 않았다.
물론 내가 못찾은 엄청 좋은 regex 라이브러리가 있을 수도 있으니.. 그때는 다시 테스트 해봐야겠지만 현재로서는 Java 1.8의 Pattern Matcher는 느리지 않으며 굳이 다른 Regex 라이브러리 말고 기본 Pattern Matcher를 써도 괜찮다고 본다.