2013년 11월 12일 화요일

[튜토리얼/한글화] V8의 자바스크립트 성능 관련 팁들(Performance Tips for JavaScript in V8)

+Chris Wilson의 'V8의 자바스크립트 성능 관련 팁들(Performance Tips for JavaScript in V8)'의 한글화 튜토리얼이 업데이트되었습니다. 번역해주신 김훈민님 감사합니다. 훈민님 사이트에 가시면 ECMA 스크립트와 자바스크립트 엔진에 대한 좋은 Overview들이 있으니 방문해보시기 바랍니다. :)

좋은 성능을 가진 코드의 작성을 하다보면 자연스럽게 실행의 Low Level에 도달하게 됩니다. (예를 들어 우리가 Native에서 어셈블리에 대해 대략적인 지식이 필요한 경우가 종종 존재하듯이 말이죠.) 실제로 자바스크립트의 규격뿐만이 아니라 엔진이 어떻게 자바스크립트 코드를 실행하고 최적화하는지에 대해 이해할 필요가 있으시다면 (특히 HTML5 3D나 대량의 연산을 위한 코드를 작성하고 계시다면) 읽어보시기 바랍니다.

"솔직하게 말씀드리면 V8 소스의 커밋 속도도 꽤 빠르게 진행됩니다. 최적화에 관련된 여러가지 요소가 지속적으로 추가되고 있지만 최소한 이 글에서 다루고 있는 내용은 아마 V8의 최적화에서 변하지 않을 내용들을 다루고 있으므로 숙지하시는 것도 좋을 듯 합니다. 다른 자바스크립트 엔진까지 자료를 취합할 수 있다면 더욱더 좋은 가이드가 만들어질 것 같습니다."


TL;DR;

이 글에서 다루는 V8의 자바스크립트 코드를 최적화 방식에 대해 이해하여 V8 엔진에서 최적화된 코드를 작성하는데 필요한 기본 지식과 간단한 예제, 지침을 담고 있습니다. :)


  • Hidden Classes
    • V8은 런타임 시에 객체에 사용하기 위해서 내부적으로 만든 hidden class을 통해 같은 hidden class를 가지고 있는 객체는 최적화된 생성 코드를 사용할 수 있습니다. 모든 객체 멤버를 생성자 함수 안에서 같은 순서로 객체 멤버를 초기화하는 형태의 코드를 통해 hidden class가 동적으로 변하지 않도록 유지하여 성능을 최적화할 수 있습니다.
  • Numbers
    • V8은 데이터 타입이 변할 때 효율적으로 값을 나타내는 태그를 사용하지만 동적인 태그를 변경하는 데에 비용이 들기 때문에 number 타입을 지속적으로 사용하는 것이 가장 좋습니다. 일반적으로 적합하다면 31비트 부호있는 정수를 사용하는 것이 최적입니다.
  • Arrays
    • 내부적으로 분리되어 처리되는 배열의 형태에 따라 최적화의 포인트는 달라질 수 있습니다. 가급적이면 연속적이고 단일한 타입을 가지며 동적으로 변환되지 않도록 배열을 유지하는 것이 중요합니다.
  • JavaScript Compilation
    • V8(크롬의 JavaScript 엔진)은 두가지의 다른 Just-In-Time(JIT) 컴파일러를 가지고 있습니다. Full Compilation과 Optimization Complation에 대해 간략한 이해를 통해 최적화된 성능을 위한 기본 지침을 제공합니다.


참조 링크