V8에서 아키텍처 복잡성을 다루기 — CodeStubAssembler
웹 툴링 벤치마크 발표
자바스크립트 성능은 항상 V8 팀의 중요 관심사였으며, 이번 포스트에서는 최근에 V8에서 일부 성능 병목 현상을 식별하고 수정하기 위해 사용한 최신 자바스크립트 웹 툴링 벤치마크에 대해 논의하고자 합니다. 이미 V8의 Node.js에 대한 강력한 의지에 대해 알고 계실 수도 있습니다. 이 벤치마크는 Node.js를 기반으로 개발된 일반적인 개발자 도구를 사용하여 성능 테스트를 실행함으로써 이러한 의지를 확장합니다. 웹 툴링 벤치마크 도구는 오늘날 개발자와 디자이너가 현대 웹 사이트나 클라우드 기반 애플리케이션을 구축하기 위해 사용하는 동일한 도구들로 구성되어 있습니다. 실제 성능에 집중하려는 지속적인 노력의 일환으로, 매일 개발자가 실행하는 실제 코드로 벤치마크를 작성하였습니다.
V8 릴리스 v6.3
V8에 ES2015 프록시를 최적화하기
프록시는 ES2015 이래 JavaScript에서 중요한 부분이었습니다. 이들은 객체에 대해 근본적인 작업을 가로채고 동작을 사용자 정의할 수 있게 해줍니다. 프록시는 jsdom 및 Comlink RPC 라이브러리와 같은 프로젝트의 핵심 부분을 형성합니다. 최근에 우리는 V8에서 프록시 성능을 개선하기 위해 많은 노력을 기울였습니다. 이 글은 V8에서의 일반적인 성능 개선 패턴과 특히 프록시에 대해 설명합니다.
게으름에 대한 인턴십: 비최적화된 함수의 게으른 언링크
약 3개월 전에 저는 V8 팀 (구글 뮌헨)에서 인턴으로 합류했으며, 그 이후로 VM의 _Deoptimizer_라는 완전히 새로운 프로젝트에 대해 작업하고 있습니다. 이는 매우 흥미롭고 도전적인 프로젝트임을 입증했습니다. 제 인턴십 첫 번째 부분은 VM의 보안성을 개선하는 데 초점을 맞췄습니다. 두 번째 부분은 성능 개선에 중점을 두었습니다. 즉, 이전에 비최적화된 함수를 언링크할 때 사용된 데이터 구조를 제거하는 작업을 수행했으며, 이는 쓰레기 수집 중 성능 병목현상을 일으킨 문제였습니다. 이 블로그 게시물은 제 인턴십의 두 번째 부분에 대해 설명하며, V8이 비최적화된 함수들을 어떻게 언링크했는지, 이를 어떻게 변경했는지, 그리고 얻은 성능 향상에 대해 설명합니다.
임시로 Escape Analysis 비활성화
JavaScript에서, 할당된 객체는 현재 함수 밖에서 접근 가능할 경우 escape(탈출)하게 됩니다. 일반적으로 V8은 새로운 객체를 JavaScript 힙에 할당하지만, escape analysis(탈출 분석)를 사용하면 최적화 컴파일러는 객체의 수명이 함수의 실행에 따라 제한된 것을 입증할 수 있을 때 특수 처리를 할 수 있습니다. 새로 할당된 객체의 참조가 그것을 생성한 함수 밖으로 탈출하지 않는 경우, JavaScript 엔진은 명시적으로 그 객체를 힙에 할당할 필요가 없습니다. 대신 이 객체의 값을 함수의 지역 변수처럼 처리할 수 있습니다. 이는 스택이나 레지스터에 값을 저장하거나, 경우에 따라 값을 완전히 최적화하여 제거하는 등 여러 가지 최적화를 가능하게 합니다. 탈출하는 객체(더 정확히 말하면, 탈출하지 않음을 증명할 수 없는 객체)들은 반드시 힙에 할당되어야 합니다.
V8의 Elements 종류
참고: 기사 읽기 대신 발표를 보는 것을 선호하는 경우 아래 비디오를 즐기세요!
JavaScript 객체는 임의의 속성을 가질 수 있습니다. 객체 속성 이름에는 어떤 문자든 포함될 수 있습니다. JavaScript 엔진이 최적화하려는 흥미로운 경우 중 하나는 속성 이름이 숫자로만 구성된 속성, 특히 배열 인덱스입니다.
V8 릴리즈 v6.2
V8에서 빠른 속성
이 블로그 게시물에서는 V8이 JavaScript 속성을 내부적으로 어떻게 처리하는지 설명하고자 합니다. JavaScript의 관점에서 속성에 대한 몇 가지 구별만 필요합니다. JavaScript 객체는 대부분 문자열 키와 임의 객체를 값으로 하는 사전처럼 작동합니다. 하지만 사양에서는 정수 인덱스 속성과 다른 속성을 반복 중 다르게 취급합니다. 그 외에는 정수 인덱스인지 아닌지에 관계없이 서로 다른 속성이 대부분 동일하게 작동합니다.