[Go] 정규표현식은 비싸다. Go


저는 개인적으로 정규표현식을 적재적소에 적용하는 걸 좋아합니다.
이 한마디로 극대노(?) 하실 분들이 계시겠지만, 정확히는 정규표현식으로 해결할 문제를 코드로 푸는 일 을 좋아한다는 의미입니다... 정규식은 정말 필요한 순간이 아니라면 안쓰는 게 미덕인 셈이죠. 자바스크립트 같이 클라이언트에서 쓰는 건데 몇 백번씩 호출할 건 아니라면, 클라이언트 사이드에서 입력 값 검증하는데 쓰는 정도 외에는 안쓰는 게 좋은 것 같아요.

정규식 대신 코드로 푸는 예를 들자면, 제가 즐겨 쓰는 방식이기도 한데, 입력받은 문자열이 숫자인 지 아닌 지 검증하는 로직을 짤 때 캐릭터 코드 값을 사용하는 방법 입니다. 문자열을 캐릭터 배열로 캐스팅 혹은 참조해 각 요소의 ASCII 값이 0을 표현하는 코드 값과 9를 표현한 코드 값 사이인 지 확인합니다. 주의할 점은 코드 값이 언어 구현체마다 다를 수 있으므로 무조건 ASCII코드 테이블만 보고 짜다간 동작이 안하는 경우가 있으니 적어도 유닛테스트 정도는 해볼 필요가 있습니다.

사설이 길었지만 요점은 정규표현식은 생각보다 자원을 많이 가져다 쓰는 작업이므로 최후의 보루 정도로 활용하는 게 좋겠죠.


<이미지 출처> http://kirael-art.deviantart.com/art/Go-lang-Mascot-458285682

Go언어로 사이드프로젝트를 만들면서 정규표현식의 사용을 잠시 고려했던 케이스가 있었습니다.
'나름 네이티브 바이너리를 뽑아내는 언어인데 성능 이슈를 발생시킬 만큼은 아니겠지???' 라는 생각에 정규표현식을 쓰려다가 그래도 성능관련으로 검색은 한번 해보는 게 좋겠다고 생각해 찾아봤습니다.

놀랍게도 Go언어 깃헙 이슈 중 언어별 정규표현식 벤치마크에서 Go언어가 Python보다 안좋은 결과(!)가 있었습니다.(regexp: investigate further performance improvements #26623 , https://github.com/golang/go/issues/26623)
물론 위 벤치 결과는 2018년 자료라 지금은 그 정도 까지는 아니라고 생각합니다. 이 와중에 D언어 정규표현식 성능이 잘 나왔네요... ㄷㄷ 사실 D언어는 정규식 패턴을 컴파일타임에 미리 컴파일하는 치트키같은 기능이 있어 잘 나온 것일 수도 있지만 그 방식으로 벤치를 뽑았을 지 잘 모르겠습니다.

조금만 더 검색해보니 Go언어로 정규표현식으로 처리한 로직이 자원을 너무 많이 써, 대신 다른 방법으로 해결한 사례도 있더군요.(My mistakes in Golang, regular expression and slice, https://tunghatbh.medium.com/programming-my-mistakes-in-golang-69bda628eb65)

위 글들을 보고..'어차피 Python보단 빠를꺼니까 그냥 쓰자..'라고 막연한 생각을 반성하게 되었습니다.
물론 본업과 관련 없는 사이드 프로젝트지만, 이런 작은 구현의 차이가 프로덕트를 뽑고 난 후에 큰 일(?)을 만들더라구요.
구현 전에 검색해보길 잘했다는 생각이 듭니다...

결론은 '정규표현식은 Go언어에서도 상당히 값 비싼 작업이니 왠만하면 쓰지 말자' 입니다.

덧글

댓글 입력 영역