Why should I know this?

Javascript Interpreting 분석 본문

v8

Javascript Interpreting 분석

die4taoam 2019. 6. 8. 02:02

0. v8 소개 및 v8 Javascript Engine Interpreting 분석을 위한 준비물

 

1. 당신의 Javascript, Bytecode로 대체되었다.

 

2. Interpreting은 function 단위로

 

3. Interpreting의 과정 한 눈에 보기

 

Interpreting은 생성된 Script class의 Run을 호출하는 것으로 시작된다.

Interpreting이 이뤄지는 과정을 일목요연하게 보기 위해,

  •  최소한의 Javascript code "1 + 1"을 실행시킨다.
  •  Uftrace를 사용하여 Tracing 데이터를 생성한다.

이를 통해 다음과 같은 결과를 얻을 수 있따.

$ uftrace record --no-libcall -F v8::Script::Run -P. out.gn/x64.release/v8_shell
V8 version 7.4.0 (candidate) [sample shell]
> 1+1
2

$ uftrace replay
# DURATION     TID     FUNCTION
            [113991] | v8::Script::Run() {
   0.324 us [113991] |   v8::platform::tracing::TracingController::GetCategoryGroupEnabled();
   0.140 us [113991] |   v8::HandleScope::Initialize();
   0.276 us [113991] |   v8::_GLOBAL__N_1::CallDepthScope::CallDepthScope();
   0.143 us [113991] |   v8::internal::TimedHistogram::Start();
   0.627 us [113991] |   v8::internal::TimerEventScope::LogTimerEvent();
   0.503 us [113991] |   v8::internal::Context::global_proxy();
            [113991] |   v8::internal::Execution::Call() {
            [113991] |     v8::internal::_GLOBAL__N_1::Invoke() {
   0.168 us [113991] |       v8::internal::PerIsolateAssertScope::IsAllowed();
   0.095 us [113991] |       v8::internal::PerIsolateAssertScope::IsAllowed();
   0.710 us [113991] |       v8::internal::PerIsolateAssertScope::IsAllowed();
            [113991] |       v8::internal::Builtins::builtin_handle() {
   0.151 us [113991] |         v8::internal::Heap::builtin_address();
   0.524 us [113991] |       } /* v8::internal::Builtins::builtin_handle */
   1.039 us [113991] |       v8::internal::SaveContext::SaveContext();
            [113991] |       v8::internal::Code::OffHeapInstructionStart() {
   0.715 us [113991] |         v8::internal::EmbeddedData::InstructionStartOfBuiltin();
   1.230 us [113991] |       } /* v8::internal::Code::OffHeapInstructionStart */
            [113991] |       Builtins_JSEntry() {
            [113991] |         Builtins_JSEntryTrampoline() {
            [113991] |           Builtins_CallFunction_ReceiverIsAny() {
            [113991] |             Builtins_InterpreterEntryTrampoline() {
            [113991] |               Builtins_StackCheckHandler() {
            [113991] |                 Builtins_LdaSmiHandler() {
   0.112 us [113991] |                   Builtins_ReturnHandler();
   1.327 us [113991] |                 } /* Builtins_LdaSmiHandler */
   2.465 us [113991] |               } /* Builtins_StackCheckHandler */
   3.668 us [113991] |             } /* Builtins_InterpreterEntryTrampoline */
   4.756 us [113991] |           } /* Builtins_CallFunction_ReceiverIsAny */
   5.273 us [113991] |         } /* Builtins_JSEntryTrampoline */
   6.585 us [113991] |       } /* Builtins_JSEntry */
   0.125 us [113991] |       v8::internal::SaveContext::~SaveContext();
  12.128 us [113991] |     } /* v8::internal::_GLOBAL__N_1::Invoke */
  12.516 us [113991] |   } /* v8::internal::Execution::Call */
   0.108 us [113991] |   v8::internal::TimerEventScope::LogTimerEvent();
   0.123 us [113991] |   v8::internal::TimedHistogram::Stop();
            [113991] |   v8::internal::Isolate::FireCallCompletedCallback() {
   0.423 us [113991] |     v8::internal::Heap::ClearKeepDuringJobSet();
   0.901 us [113991] |   } /* v8::internal::Isolate::FireCallCompletedCallback */
  18.455 us [113991] | } /* v8::Script::Run */
  

우리가 v8_shell 을 실행하여 "1+1"이라는 Javascript code를 실행하면, v8 내부에서는 "1+1"이라는 Javascript를 컴파일하여 bytecode배열을 생성하게 된다. 이것은 전 챕터에서 다룬 내용이다.

 

4. Interpreting 상세

'v8' 카테고리의 다른 글

[졸간분] 최적화 기법 on-stack replacement  (0) 2019.11.14
Nodejs 최적화 Tip?  (0) 2019.11.13
Build and Test  (0) 2019.05.31
v8 인터프리터 분석 - 함수 호출  (0) 2019.03.15
v8 tracing 지원을 위한 작업 기록  (0) 2018.11.20
Comments