2009.04.23 21:09
요즘 수업중에 Perl을 아주 조금 써보고 있는데, Perl의 성능이 궁금해서 찾아보는데, 최근 결과가 별로 없어서 간단한 정규표현식 테스트를 직접해보았습니다. 알파벳과 한글이 같이 있는 문자열에서 알파벳을 알파벳이 아닌 문자를 '_'로 바꾸는  테스트입니다. 정규표현식 문자열 치환 테스트를 하는 이유는 펄에서 정규표현식을 언어수준에서 잘 지윈하고 있기 때문입니다.
CPU Q6600, Memory 4G, Fedora 10 x86_64, Java는 openJDK 1.6 x86_64, Perl은 perl.x86_64 에서 이클립스로 작성후 테스트.

결론부터 말씀드리자면 일단 속도에서는 자바 완승,
메모리는 Perl 완승 입니다.

실제 코드는 다음과 같습니다.
자바
StringBuilder 를 사용해서 문자열을 붙이고 String 클래스의 replaceAll 메소드를 사용해서 치환합니다.

다음은 펄.
. 를 사용해서 문자열을 붙이고, s/ / /g를 사용해서 치환합니다.
펄에서도 미리초를 가져오는 모듈도 있는데, 제가 아직 모듈을 설치할 줄 모르고 귀찮아서 패스...

어쨌거나 문자열을 붙이는 데 걸리는 시간
자바 2.514초
펄    2 초
펄 결과는 초단위므로 비교어려움. 거의 유사한 속도를 보인것으로 보임.

다음은 치환하는데 걸리는 시간.
자바 6.860초
펄    27초
자바가 펄보다 4배 정도 빠름

충격적인 결과. 메모리 사용량(System Monitor를 통해 눈으로 확인)
자바
문자열 생성할 때의 메모리 사용량 650M 정도
문자열 치환할 때의 메모리 사용량 950M 정도

문자열 생성할 때의 메모리 사용량 290M 정도
문자열 치환할 때의 메모리 사용량 389M 정도
자바가 펄보다 2배나 메모리 많이 사용함

...사실 2억자를 파일에 써보니(UTF-8) 400,000,040 bytes 가 되네요. 대략 400메가 정도?
펄이 파일에 기록한 후의 크기보다 적은 메모리를 사용한 다는 것이 인상적이네요. 메모리엔 그냥 정수도 갖고 있어서 그런가...

...
어쨌든 자바가 펄보다 더 빠르긴 하네욥.

트랙백 주신 글이나 댓글을 보면, 펄에서 utf-8 인코딩을 사용하는 방법이나 치환 방법에 문제가 있었습니다.
펄을 잘 모르는 초보자의 성급한 결론이었습니다.
^^;;;;;
Posted by 나야

댓글을 달아 주세요

  1. amorette 2009.04.25 12:29 신고  댓글주소  수정/삭제  댓글쓰기

    나야님 게시물 잘 보았습니다.
    그런데 어떻게 알파벳을 _ 로 고치는 regex가 [^a-z]+ 가 되는건가요?

  2. 김동현 2009.05.14 09:15  댓글주소  수정/삭제  댓글쓰기

    매우 긴 문자열에서의 g 옵션이 붙은 글로벌 치환은 비용이 많이 들어간다고 합니다.
    이에 대한 대책이 있나봅니다. http://kldp.org/node/68300

    • 나야 2009.05.14 11:08 신고  댓글주소  수정/삭제

      그런문제도 있었군요~ 달아주신 링크는 나중에 천천히 읽어봐야 겠네요. 요즘 펄이라는 언어에 대해 감탄하고 있습니다.

  3. Len0k 2012.11.27 03:16  댓글주소  수정/삭제  댓글쓰기

    perl에서 하나의 문자열에서 해당 문자를 전부 찾아 치환하는데에는 s/// 대신 tr/// 빌트인을 사용해야 합니다.
    윈도우에서 테스트했기 때문인지 모르겠지만 java가 10000000 횟수의 for문처리는 에러를 뿜어 자릿수를 한단계내렸습니다. 그러한 결과 tr///빌트인을 사용했을때에 perl이 각각 150msec와 440msec java는 130msec와 750msec의 속도를 기록했습니다.

    아래는 codepad에 올려놓은 perl과 java 코드 입니다.(java오류로 10000000 횟수를 1000000으로 내림)
    http://codepad.org/1DCGRDUi
    http://codepad.org/bTovHk9G

    테스트 환경
    OS 이름 Microsoft Windows 7 Professional K
    프로세서 Intel(R) Core(TM) i3-2130 CPU @ 3.40GHz, 3400Mhz, 2 코어, 4 논리 프로세서
    설치된 실제 메모리(RAM) 8.00GB

    범용성을 위해 32bit 버전사용
    perl 버전 - Strawberry Perl 5.16.2.1-32bit
    java 버전 - jdk1.7.0_09(x86)