Computer >> 컴퓨터 >  >> 프로그래밍 >> Ruby

Ruby &Rails용 JIT 컴파일러:YJIT, MJIT, TenderJIT로 성능 향상

프로그램은 실행 전 컴파일과 다른 방법을 사용하여 런타임에 컴파일됩니다. 이 프로세스를 적시 컴파일 또는 동적 번역이라고 합니다.

이 게시물에서는 사용 가능한 옵션(YJIT, MJIT, TenderJIT)과 설치 방법을 살펴보기 전에 JIT 컴파일이 Ruby on Rails 앱에 적합한 선택이 될 수 있는 이유를 살펴보겠습니다.

하지만 먼저 JIT 컴파일은 어떻게 작동하나요?

JIT 컴파일러 작동 방식

JIT(Just-In-Time) 컴파일은 프로그램을 실행하는 동안 컴파일이 필요한 컴퓨터 코드를 실행하는 방법입니다.

소스 코드를 번역해야 할 수도 있지만 바이트코드를 기계어 코드로 변환한 후 직접 실행하는 방식으로 가장 자주 수행됩니다.

실행되는 코드는 JIT 컴파일러를 사용하는 시스템에 의해 지속적으로 분석되는 경우가 많습니다. 이는 컴파일 또는 재컴파일(속도 측면에서)의 이점이 비용보다 더 큰 코드 섹션을 식별합니다.

Ruby용 JIT 컴파일의 이점

JIT 컴파일은 프로그램을 기계어 코드로 변환하는 두 가지 기존 방법인 해석과 AOT(Ahead-of-Time 컴파일)의 장점(및 단점)을 결합합니다.

대략적으로 말하면 해석의 유연성과 생성된 코드의 속도, 컴파일 및 링크(단순한 해석이 아님)의 추가 오버헤드가 결합되어 있습니다.

JIT 컴파일은 특정 마이크로 아키텍처에 맞는 동적 재컴파일 및 속도 향상을 포함한 적응형 최적화 기술을 가능하게 하는 동적 컴파일 유형입니다. 런타임에 바인딩된 데이터 유형을 처리하고 보안을 보장하는 런타임 시스템의 기능으로 인해 Ruby와 같은 동적 프로그래밍 언어는 해석 및 JIT 컴파일에 특히 적합합니다.

GCC와 같은 최적화 컴파일러는 명령어를 보다 효율적으로 최적화할 수 있는데, 이는 레지스터 지향 아키텍처 채택의 중요한 이점입니다. 컴파일러는 레지스터 기반 아키텍처를 사용하여 중간 표현으로 작동합니다.

컴파일 중에 명령어가 중간 표현에 도달하면 GCC는 CPU의 명령어 실행 속도를 높이기 위해 추가 패스를 수행합니다.

Ruby용 JIT 컴파일러:YJIT, MJIT 및 TenderJIT

이제 Ruby에서 사용할 수 있는 다양한 JIT 컴파일러(YJIT, MJIT, TenderJIT)와 이를 설정하는 방법을 살펴보겠습니다.

Ruby용 MJIT(메소드 기반 Just-in-time 컴파일러)

Vladimir Makarov가 구현한 MJIT는 C 언어를 기반으로 Ruby에 구현된 최초의 컴파일러 방법론입니다. Ruby 2.6과 함께 작동하고 YARV 명령어를 사용하며 바이너리 코드에서 자주 사용되는 명령어를 컴파일합니다.

입력/출력 바인딩되지 않은 프로그램의 경우 MJIT가 성능을 향상시킵니다.

YJIT는 성능 측면에서 원래 C 기반 컴파일러보다 낫습니다. Ruby 3의 JIT는 MJIT의 탁월한 작업으로 가능해진 MRI 사상 가장 빠른 JIT입니다.

MJIT 사용방법

MJIT를 사용하려면 Ruby 2.6에서 --jit를 사용하여 JIT를 활성화할 수 있습니다. 옵션입니다.

 

이 부분을 건너뛰면 MJIT에서 오류가 표시됩니다.

 

Ruby 2.6에 포함된 JIT 관련 설정 모음은 이것이 어떻게 작동하는지 이해하는 데 도움이 됩니다. ruby --help 실행 이 옵션을 보려면.

즉, MJIT는 다른 스레드에서 실행되며 비동기적입니다. 처음 5번의 계산 실행 후에 적시 컴파일이 시작됩니다.

Ruby on Rails용 YJIT

YJIT라는 최근 JIT 컴파일러가 Ruby 3.1과 함께 출시되었습니다. 많은 개선과 더 나은 성능을 약속합니다. 실험 결과를 바탕으로 Shopify에서 설계한 아직 진행 중인 프로젝트이므로 특히 대규모 애플리케이션에서는 주의해서 사용해야 합니다.

이를 염두에 두고 YJIT는 Ruby on Rails 애플리케이션의 성능을 향상시킵니다. 실제 소프트웨어의 대부분은 YJIT 기본 블록 버전 관리 JIT 컴파일러가 제공하는 빠른 준비 및 성능 향상의 이점을 누리고 있습니다.

JIT 컴파일러는 YJIT 프로젝트의 일부로 CRuby에 점진적으로 구축되어 결국 대부분의 코드 실행에 대한 인터프리터를 대체할 것입니다.

공식 벤치마크('YJIT:CRuby용 새 JIT 컴파일러 구축' 참조)에서는 YJIT가 다음을 통해 기본 CRuby 인터프리터에 비해 성능이 향상되었음을 보여줍니다.

  • 레일스벤치에서 20%
  • 액체 템플릿 렌더링 시 39%
  • 활성 레코드의 37%

그러나:

Railsbench 명령의 약 79%만이 YJIT에 의해 실행되고 나머지는 기본 인터프리터에서 실행됩니다.

출처:YJIT:CRuby용 새 JIT 컴파일러 구축

이는 YJIT의 현재 결과를 개선하기 위해 아직 해야 할 일이 많다는 것을 의미합니다.

그럼에도 불구하고 YJIT는 모든 벤치마크, 심지어 하드스톤에서도 적어도 통역사만큼 뛰어난 성능을 발휘하며 모든 벤치마크를 한 번만 반복하면 거의 최고 성능에 도달합니다.

YJIT 사용방법

참고 :YJIT는 현재 x86-64 플랫폼의 macOS 및 Linux로 제한됩니다. 또한 언급한 바와 같이 YJIT는 (아직) 대규모 애플리케이션에는 권장되지 않습니다.

YJIT는 기본적으로 비활성화되어 있습니다. 활성화하려면 먼저 --yjit를 지정하세요. 명령줄 옵션입니다.

설치되어 있는지 확인해야 하므로 ruby --enable-yjit -v를 실행하세요. . warning: unknown argument for --enable: 인 경우 yjit'`가 나타나면 설치해야 합니다.

그런 다음 irb을 엽니다. RUBY_YJIT_ENABLE=1을 설정하고 . 종료하면 이제 YJIT를 사용할 준비가 되었습니다. ruby --enable-yjit -v 명령 ruby 3.1.0p0 (2021-12-25 revision fb4df44d16) [arm64-darwin21]과 같은 값을 반환해야 합니다.

TenderJIT

주로 YJIT를 기반으로 한 디자인을 갖춘 TenderJIT는 Ruby용 실험적인 JIT 컴파일러입니다. TenderJIT의 다른 점은 순수 Ruby로 작성되었다는 것입니다.

이것은 데모 프로젝트이며 목표는 보석으로 출시하는 것입니다. 그동안 실험해 볼 수 있지만 아직 진행 중인 작업이라는 점을 명심하세요. TenderJIT에는 Ruby 3.0.2 이상이 필요합니다.

TenderJIT 사용 방법

TenderJIT는 현재 자동으로 메서드 컴파일을 수행하지 않습니다. 메서드를 컴파일하려면 TenderJIT를 수동으로 구성해야 합니다.

저장소를 복제하고 다음 명령을 실행하십시오:

 

코드에서 수동으로 설정해야 합니다:

 

대상 메서드의 각 YARV 명령어는 TenderJIT에서 읽은 다음 이를 기계어 코드로 변환합니다.

TenderJIT에 대한 더 많은 예를 보려면 다음 동영상 중 하나를 확인하세요. Aaron Patterson과 함께하는 Ruby용 JIT 컴파일러 및 TenderJIT 해킹!

마무리

이 게시물에서는 세 가지 Ruby용 JIT 컴파일러(MJIT, YJIT, TenderJIT)와 이를 설정하는 방법을 간략하게 살펴보았습니다. 각 옵션은 실험적이며 고유한 제한 사항이 있습니다.

하지만 YJIT는 현재 가장 성숙하고, 성장하고 확장할 수 있는 잠재력이 가장 크다. 이는 다른 Ruby JIT에 비해 더 나은 성능을 보여주고 Ruby 3.1.0으로 개발되었으며 빠르게 CRuby의 중요한 부분이 되고 있습니다.

자신만의 Ruby용 컴파일러를 구축하고 싶다면 이 게시물을 확인해 보세요.

즐거운 코딩 되세요!

추신 Ruby Magic 게시물이 보도되는 즉시 읽으려면 Ruby Magic 뉴스레터를 구독하고 단 하나의 게시물도 놓치지 마세요!

Ruby &Rails용 JIT 컴파일러:YJIT, MJIT, TenderJIT로 성능 향상

레나타 마르케스

우리의 객원 저자인 Renata는 Ruby와 Javascript에 중점을 둔 소프트웨어 엔지니어이자 컴퓨터 과학자입니다. 그녀는 오픈 소스 프로젝트에 기여하여 개발자 커뮤니티를 돕는 것을 좋아합니다. 여가 시간에는 영화와 TV 쇼를 보고 토론하고, 책을 읽고, 음악을 듣고, 사진을 찍고, 비디오를 만드는 것을 좋아합니다.

Renata Marques의 모든 기사