‘require set’ 제거 그 이상: 코어 Set이 메모리를 33% 절감하고 SortedSet에 무슨 일이 일어났는가

Ruby 4.0 Set: Performance Gains & Migration Tips You Need | Write A Catalyst

작성자
알 수 없음
발행일
2026년 01월 05일

핵심 요약

  • 1 Ruby 4.0에서 `Set` 클래스가 코어 라이브러리로 편입되며 C로 재작성되어 메모리 사용량을 최대 33% 절감하고 연산 속도를 2~10배 향상시켰습니다.
  • 2 이전 `stdlib`의 `Set`이 `Hash` 래퍼였던 것과 달리, 새로운 코어 `Set`은 `set_table`을 사용하여 불필요한 값 저장을 제거하여 효율성을 극대화했습니다.
  • 3 `SortedSet`은 Ruby 4.0에서 제거되었으므로, 기존 사용자는 `sorted_set` 젬을 명시적으로 설치하고 `require`해야 하는 마이그레이션 변경 사항에 유의해야 합니다.

도입

Ruby 4.0은 개발자들이 오랫동안 기대해왔던 변화 중 하나로 `Set` 클래스를 표준 라이브러리(`stdlib`)에서 코어 라이브러리로 이동시켰습니다. 단순히 `require 'set'` 문을 제거하는 편의성을 넘어, 이 변경은 `Set`의 내부 구현을 완전히 재작성하여 전례 없는 성능 향상을 가져왔습니다. 본 보고서는 Ruby 4.0의 코어 `Set`이 어떻게 메모리 사용량을 획기적으로 줄이고 연산 속도를 비약적으로 높였는지, 그리고 `SortedSet`의 제거와 같은 주요 변경 사항에 대해 심층적으로 다룹니다.

Ruby 4.0 코어 Set의 혁신적인 변화

Ruby 4.0의 Set은 단순히 위치를 옮긴 것이 아니라, C 언어로 완전히 재작성되었습니다. 이전 stdlibSetHash의 래퍼 형태로 구현되어 각 엔트리에 불필요한 값을 저장하여 메모리를 낭비했습니다. 반면, 새로운 코어 Setst_table의 경량화된 버전인 set_table을 사용하여 해시와 키만 저장함으로써 메모리 효율성을 극대화했습니다.

  • 메모리 사용량 절감:
    • 대규모 Set의 경우 33%의 메모리 사용량 절감.
    • 소규모 Set의 경우에도 20% (200바이트에서 160바이트로) 절감.
  • 연산 속도 향상:
    • 대부분의 Set 연산이 stdlib 버전에 비해 2배에서 10배 더 빨라졌습니다.
    • union, intersection, difference와 같은 복합 연산은 4~5배 향상.
    • add, delete와 같은 기본 연산도 C 함수로 구현되어 훨씬 빨라졌습니다.
    • 실제 프로덕션 데이터 파이프라인에서 8.4초 걸리던 작업이 3.1초로 단축되었습니다.

주요 변경 사항 및 마이그레이션 고려사항

Ruby 4.0으로 업그레이드 시 개발자들이 인지해야 할 몇 가지 중요한 변경 사항이 있습니다.

  • SortedSet 제거:
    • SortedSet은 더 이상 코어 라이브러리의 일부가 아니며, 완전히 제거되었습니다.
    • 기존에 SortedSet을 사용하던 프로젝트는 sorted_set 젬을 설치하고 명시적으로 require해야 합니다. 자동 로딩 메커니즘은 제공되지 않습니다.
  • inspect 출력 형식 변경:
    • 이전: #<Set: {1, 2, 3}>
    • 이후: Set[1, 2, 3]
    • 디버깅, 로깅, 직렬화 등 Setinspect 출력을 파싱하는 코드가 있다면 수정이 필요합니다.
  • 내부 구현:
    • stdlib Set은 Ruby로 작성되었으나, 코어 Set은 대부분 C로 재작성되어 Ruby 인터프리터 오버헤드를 제거했습니다.
    • divide 메서드는 tsort 의존성 없이 커스텀 알고리즘으로 재구현되었습니다.
  • 하위 클래스 호환성:
    • Set을 상속받는 경우, Set::SubclassCompatible 모듈이 자동으로 포함되어 stdlib Set의 동작을 유지합니다.
    • 단, 이 경우 C 확장으로 인한 성능 향상은 적용되지 않으므로, 성능이 중요하다면 상속 대신 컴포지션을 고려해야 합니다.

결론

Ruby 4.0의 `Set` 코어 편입은 단순한 편의성 개선을 넘어, Ruby 언어의 기술 부채를 해결하고 핵심 데이터 구조의 성능을 근본적으로 향상시키는 중요한 이정표입니다. 메모리 사용량 33% 절감과 최대 10배에 달하는 연산 속도 향상은 `Set`을 기피했던 개발자들에게 새로운 가능성을 제시합니다. `require 'set'` 제거, `SortedSet` 마이그레이션, `inspect` 출력 형식 변경 등의 마이그레이션 단계를 숙지하고 적용함으로써, 개발자들은 Ruby 4.0이 제공하는 강력한 성능 이점을 활용하여 보다 효율적이고 간결한 코드를 작성할 수 있을 것입니다. 이는 Ruby 애플리케이션의 전반적인 성능을 크게 향상시킬 것입니다.

댓글 0

로그인이 필요합니다

댓글을 작성하거나 대화에 참여하려면 로그인이 필요합니다.

로그인 하러 가기

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!