TypedData 객체는 일반 Ruby 객체와 유사하나, 내부적으로는 임의 데이터 포인터를 저장하도록 설계되어 인스턴스 변수보다 빠르고 Ruby 객체 외 데이터 저장에 용이합니다. 주요 필드는 가비지 컬렉터 메타데이터를 위한 ‘headers’, TypedData 객체 구성(이름, 마크/프리 함수, 플래그) 포인터인 ‘type’, 그리고 임의 메모리 영역 포인터인 ‘data’로 구성됩니다.
새롭게 도입된 임베디드 TypedData 객체는 데이터를 외부에 할당하는 대신, 객체 바로 뒤에 직접 할당합니다. 이 방식은 두 번의 할당을 단일 Ruby 객체 할당으로 줄여 성능을 크게 향상시킵니다. 또한, 포인터 추적 없이 데이터에 직접 접근하여 런타임 성능을 개선하고, 8바이트 포인터 저장 및 시스템 할당 메모리 관리 비용을 절감하여 메모리 사용량을 줄입니다. 이로써 외부 메모리 단편화 문제 완화에도 기여합니다. 이 기능은 RUBY_TYPED_EMBEDDABLE
플래그를 통해 선택적으로 적용되며, 데이터가 여러 TypedData 객체 간에 공유되지 않아야 합니다.
이 기능은 Time, Enumerator, Method 등 30개 이상의 주요 TypedData 객체에 적용되었습니다. 시스템 malloc을 통한 메모리 할당이 불필요해짐으로써, 임베디드 TypedData 객체의 할당 속도는 현저히 빨라졌습니다. 예를 들어, Time.now
에서 80%, Object#to_enum
에서 68%, Object#method
에서 거의 50%의 속도 향상을 기록했습니다. 이는 CRuby 애플리케이션의 전반적인 성능에 긍정적인 영향을 미칩니다.