Ruby의 JSON 최적화, Part 1

8 hours ago 2

사실 대안이 필요하지 않음

  • ruby/json은 oj보다 약간 느리지만, 차이는 크지 않음.
  • oj는 성능 때문에 인기가 많지만, 여러 문제를 일으킬 수 있음.
  • oj의 문제점 중 하나는 Oj.mimic_JSON을 통한 원숭이 패치로 인해 발생하는 보안 문제임.

몽키 패치의 책임

  • Oj.mimic_JSON과 Oj.optimize_rails는 JSON의 덜 효율적인 구현을 대체하지만, 문제가 발생할 수 있음.
  • 예를 들어, script_safe 옵션을 무시하여 XSS 공격에 취약해질 수 있음.
  • 몽키 패치는 신중하게 수행되어야 하며, API의 진화에 따라 안전하게 대처해야 함.

불안정성

  • oj는 대규모 운영에서 루비 충돌의 주요 원인 중 하나였음.
  • oj는 매우 활발히 개발되고 있어 새로운 충돌이 자주 발생함.
  • oj의 코드베이스에는 신뢰하기 어려운 더러운 해킹이 존재했음.

기초 작업

  • ruby/json을 oj와 비슷한 성능으로 개선하여 원숭이 패치의 필요성을 줄이고자 함.
  • 벤치마크를 설정하고 C 프로파일러를 사용하여 성능을 분석함.

중복 검사 피하기

  • JSON.dump 벤치마크에서 중복된 UTF-8 검사를 피하여 성능을 개선함.
  • rb_enc_str_asciionly_p와 isLegalUTF8의 중복 작업을 제거하여 3%의 성능 향상을 이룸.

더 저렴하고 가능성이 높은 조건 먼저 확인

  • fbuffer_inc_capa 함수에서 버퍼가 이미 할당되었는지 확인하는 조건을 최적화하여 15%의 성능 향상을 이룸.

설정 비용 줄이기

  • ruby/json의 설정 비용을 줄여 마이크로 벤치마크에서 성능을 크게 개선함.

포인터 추적 피하기

  • rb_enc_get 호출을 제거하여 성능을 8% 개선함.

조회 테이블

  • 조회 테이블을 사용하여 JSON 문자열 덤프의 성능을 30% 개선함.

계속될 이야기

  • 더 많은 최적화가 있지만, 다음 글에서 다룰 예정임.

Read Entire Article