본문으로 건너뛰기

"internals" 태그로 연결된 34개 게시물개의 게시물이 있습니다.

모든 태그 보기

WebAssembly 개발자를 위한 코드 캐싱

· 약 8분
[Bill Budge](https://twitter.com/billb), 캐싱에 'Ca-ching!'을 더하다

개발자들 사이에는 가장 빠른 코드는 실행되지 않는 코드라는 말이 있습니다. 마찬가지로, 가장 빠른 컴파일 코드도 컴파일되지 않아야 합니다. WebAssembly 코드 캐싱은 Chrome과 V8에 새롭게 도입된 최적화 기술로, 컴파일러가 생성한 네이티브 코드를 캐싱하여 코드 컴파일을 피하려고 합니다. 우리는 JavaScript 코드 캐싱에 관해 이미 글을 작성했으며, 이 최적화를 활용하기 위한 모범 사례에 대해 논의한 바 있습니다. 이번 블로그 글에서는 Chrome의 WebAssembly 코드 캐싱 운영 방식과 이를 통해 대형 WebAssembly 모듈을 사용하는 애플리케이션의 로딩 속도를 높이는 방법에 대해 설명합니다.

번개처럼 빠른 파싱, 2부: 지연 파싱

· 약 12분
툰 베르와스트 ([@tverwaes](https://twitter.com/tverwaes))와 마르야 횔타 ([@marjakh](https://twitter.com/marjakh)), 더 얇은 파서

이 시리즈는 V8이 자바스크립트를 가능하게 가장 빠르게 파싱하는 방법을 설명합니다. 첫 번째 글에서는 V8의 스캐너가 빠르게 작동하도록 만든 방법을 설명했습니다.

파싱은 소스 코드를 중간 표현으로 변환하여 컴파일러(V8의 경우는 바이트코드 컴파일러 Ignition)가 사용할 수 있도록 만드는 단계입니다. 파싱과 컴파일링은 웹 페이지 시작의 중요한 경로에서 발생하며, 브라우저에 전달된 모든 함수가 시작 시 즉시 필요한 것은 아닙니다. 개발자는 비동기 및 지연 스크립트를 사용하여 그러한 코드를 지연시킬 수 있지만, 항상 그것이 가능한 것은 아닙니다. 또한 많은 웹 페이지는 특정 기능에서만 사용되는 코드를 전달하며, 사용자가 페이지를 한 번 실행하는 동안 전혀 접근하지 않을 수 있습니다.

JavaScript 개발자를 위한 코드 캐싱

· 약 12분
[Leszek Swirski](https://twitter.com/leszekswirski), 캐시 스매셔

코드 캐싱(바이트코드 캐싱이라고도 함)은 브라우저에서 중요한 최적화 기술입니다. 이것은 파싱 + 컴파일 결과를 캐싱하여 자주 접속하는 웹사이트의 시작 시간을 줄입니다. 대부분의 인기 브라우저에서 어떤 형태로든 코드 캐싱을 구현하고 있으며, Chrome도 예외는 아닙니다. 실제로 우리는 Chrome과 V8이 컴파일된 코드를 어떻게 캐싱하는지에 대해 작성하고, 개선하며, 설명한 바 있습니다.

JIT-less V8

· 약 3분
Jakob Gruber ([@schuay](https://twitter.com/schuay))

V8 v7.4는 이제 런타임 실행 코드 메모리를 할당하지 않고 자바스크립트를 실행할 수 있습니다.

기본 설정에서, V8은 실행 가능한 메모리를 런타임에 할당하고 수정하는 능력에 크게 의존합니다. 예를 들어, TurboFan 최적화 컴파일러는 뜨거운 자바스크립트(JS) 함수에 대해 즉석에서 네이티브 코드를 생성하며 대부분의 JS 정규 표현식은 irregexp 엔진에 의해 네이티브 코드로 컴파일됩니다. 런타임에 실행 가능한 메모리를 생성하는 것은 V8의 속도를 높이는 요인 중 하나입니다.

Liftoff: V8에서 WebAssembly의 새로운 기본 컴파일러

· 약 12분
Clemens Backes, WebAssembly 컴파일의 대가

V8 v6.9에는 WebAssembly의 새로운 기본 컴파일러인 Liftoff가 포함되어 있습니다. Liftoff는 데스크탑 시스템에서 기본적으로 활성화되어 있습니다. 이 글에서는 다른 컴파일 단계 추가의 동기를 상세히 설명하고 Liftoff의 구현 및 성능에 대해 설명합니다.

V8의 동시 마킹

· 약 10분
Ulan Degenbaev, Michael Lippautz, 그리고 Hannes Payer — 메인 스레드 해방자

이 게시글은 _동시 마킹_이라는 가비지 컬렉션 기술에 대해 설명합니다. 해당 최적화는 자바스크립트 애플리케이션이 실행을 계속하는 동안 가비지 컬렉터가 힙을 스캔하여 살아있는 객체를 찾고 마킹하도록 허용합니다. 우리의 벤치마크는 동시 마킹이 메인 스레드에서 마킹에 소요되는 시간을 60%–70% 감소시킨다는 것을 보여줍니다. 동시 마킹은 Orinoco 프로젝트의 마지막 퍼즐 조각으로, 기존 가비지 컬렉터를 대부분 동시적이고 병렬적인 새로운 가비지 컬렉터로 점진적으로 대체하는 프로젝트입니다. 동시 마킹은 크롬 64 및 Node.js v10에서 기본적으로 활성화되어 있습니다.

JS에서 DOM로, 그리고 다시 되돌아오는 경로 추적

· 약 4분
DOM의 동맹 — 울란 데겐바에브, 알렉세이 필리포브, 미하엘 립파우츠, 그리고 한네스 페이어

Chrome 66에서 메모리 누수를 디버깅하는 것이 훨씬 쉬워졌습니다. Chrome DevTools는 이제 C++ DOM 객체를 추적하고 스냅샷을 찍을 수 있으며 JavaScript에서 참조된 모든 접근 가능한 DOM 객체를 표시할 수 있습니다. 이 기능은 V8 가비지 컬렉터의 새로운 C++ 추적 메커니즘의 이점 중 하나입니다.

게으른 역직렬화

· 약 5분
Jakob Gruber ([@schuay](https://twitter.com/schuay))

요약: 최근 V8 v6.4에서 기본적으로 게으른 역직렬화를 활성화하여 V8의 브라우저 탭당 메모리 소비량을 평균적으로 500 KB 이상 감소시켰습니다. 자세히 알아보세요!

V8 스냅샷 소개

하지만 먼저, V8이 힙 스냅샷을 사용하여 새 Isolate(대략 크롬의 브라우저 탭과 일치)를 생성하는 속도를 어떻게 높이는지에 대해 살펴보겠습니다. 제 동료 Yang Guo는 사용자 정의 시작 스냅샷 기사에서 이에 대해 잘 설명했습니다:

해시 테이블 최적화: 해시 코드 숨기기

· 약 4분
[사트야 구나세카라](https://twitter.com/_gsathya), 해시 코드의 관리인

ECMAScript 2015는 Map, Set, WeakSet, WeakMap과 같은 해시 테이블을 기본적으로 사용하는 몇 가지 새로운 데이터 구조를 도입했습니다. 이 글에서는 최근 개선 사항에 대해 설명하며, V8 v6.3+이 해시 테이블에서 키를 저장하는 방법을 제공합니다.