콘텐츠로 이동

2024 02 28

2024-02-27

Scala replace vs replaceAll

  • replace, replaceAll 모두 java.lang.String의 것을 사용
  • replace

    • 특정한 캐릭터, 혹은 문자열이 타겟에 포함되어 있다면, 전부 대체
    • regex를 지원하진 않음
      val str = "Hello, World"
      str.replace("World", "Scala") // "Hello, Scala"
      
    • 시간복잡도 O(n) - n: 문자열 길이
  • replaceAll
    • 첫번째 아규먼트로 regex를 가질 수 있음
    • 정규표현식을 사용하다보니 강력하지만, 느리게 만들 수 있음
    • 보통 O(n), 백트래킹 등이 들어가면 O(n)보다 느려질 수도
  • 성능 차이
    • 그냥 간단한 문자열 대체라면 비슷한 성능
    • 하지만 replaceAll의 빡센 정규표현식을 입힌다면, 훨씬 느릴 수 있음
    • 다만 타겟 문자열이 엄청 커야 티가 날 듯
    • 그냥 퍼포먼스 생각하면 replace가 나을 듯
  • 정규표현식이 느린이유
    1. 계산이 많이 필요함 : 더 복잡한 패턴일수록, 더 많은 계산 필요
    2. 백트래킹 : 특정 패턴 시도 -> 실패 -> 시도 사이클을 반복할수도
    3. 정규표현식 컴파일 : 정규표현식 자체가 작은 프로그래밍 언어, 돌리기 전에 컴피일 대상임. 계속 컴파일을 해야한다면 오버헤드임