V8 이 V8.0 을 릴리즈

Jimmy Moon

Jimmy Moon

Chief Editor

V8 이 V8.0 을 릴리즈 했다. V8 이름 덕분에 여러가지 버전명이 예상 되었지만 V8.0 으로 릴리즈 되었다. 특별하게 추가 된 기능이나 컴파일러 소식은 없지만 퍼포먼스와 메모리 관리에 향상이 있었다.

Pointer compression

V8 의 힙 메모리에서 대부분을 차지하는 Tagged value 포인터의 비트를 절약하는 방법을 찾아내어 힙메모리가 평균 40% 정도 절약 되었다. 이에 따라서 페이스북, CNN 그리고 구글 맵스와 같은 사이트의 수행 시간이 각각 모바일, 테스크탑에서 4~10% 가량 줄었고 가비지 콜렉팅의 시간이 10% ~ 20% 가량 줄었다.

Optimizing higher-order builtins

기존에 사용자-정의 함수으로 일반 적으로 호출 되던 higher-order builtins 함수가 아래와 같다면,

const charCodeAt = Function.prototype.call.bind(String.prototype.charCodeAt)
charCodeAt(string, 8)

TurboFan 의 최적화를 통해서 실제 내장 함수를 호출 하도록 변경되어 직접 실제 내장 함수를 호출하는 것과 같은 성능을 보여준다. Function.prototype.apply, Reflect.apply 그리고 Array.prototype.map 등이 영향을 받는다

string.charCodeAt(8)

Option chaining

체이닝 프로퍼티 접근 시에 아래처럼 매번 값의 null 또는 undefined 를 검사하거나 에러를 무시하고 접근 했다면

// Error prone-version, could throw.
const nameLength = db.user.name.length
// Less error-prone, but harder to read.
let nameLength
if (db && db.user && db.user.name) nameLength = db.user.name.length

Optional chaining 연산자 ?. 는 값의 검사와 할당을 동시에 할 수 있다. 만약 값이 기대한 값을 가지고 있지 않다면 아래 표현은 undefined 로 평가 된다.

// Still checks for errors and is much more readable.
const nameLength = db?.user?.name?.length

Nullish coalescing

Nullish coalescing 기본값을 다룰 수 있는 새로운 이항 연산자가 추가. 기존에 || 과 용법은 비슷하지만 Nullish (null or undefined) 에만 false 로 판단 된다. 아래 예제를 참고하자

false ?? true // => false
0 ?? 1 // => 0
'' ?? 'default' // => ''
null ?? [] // => []
undefined ?? [] // => []