Ruby 4.0 코어 Set의 혁신적인 변화
Ruby 4.0의 Set은 단순히 위치를 옮긴 것이 아니라, C 언어로 완전히 재작성되었습니다. 이전 stdlib의 Set은 Hash의 래퍼 형태로 구현되어 각 엔트리에 불필요한 값을 저장하여 메모리를 낭비했습니다. 반면, 새로운 코어 Set은 st_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] - 디버깅, 로깅, 직렬화 등
Set의inspect출력을 파싱하는 코드가 있다면 수정이 필요합니다.
- 이전:
- 내부 구현:
stdlibSet은 Ruby로 작성되었으나, 코어Set은 대부분 C로 재작성되어 Ruby 인터프리터 오버헤드를 제거했습니다.divide메서드는tsort의존성 없이 커스텀 알고리즘으로 재구현되었습니다.
- 하위 클래스 호환성:
Set을 상속받는 경우,Set::SubclassCompatible모듈이 자동으로 포함되어stdlibSet의 동작을 유지합니다.- 단, 이 경우 C 확장으로 인한 성능 향상은 적용되지 않으므로, 성능이 중요하다면 상속 대신 컴포지션을 고려해야 합니다.