2017-09-08 3 views
1

음, 또 다른 최적화 질문입니다. V8 이 변수에 대한 유형 추론을 수행하는지 여부를 알고 싶습니다. 해당 변수를 기반으로 액세스를 최적화하십시오. V8에 유형 유추 최적화가 있습니까?

let input = "keyboard"; 
// ^^^^^ input is String because "keyboard" is String 

특정 표현의 종류 만 실행에 도착 할 수 있기 때문에 그 V8에 상황, 예를 들어,이 유형을 추론하지 않으며 accidentaly을 최적화 할 수 있습니다 위치 :

유형의 추론은 다음과 같이 될 것이다 시각?

절대적으로, 지역 s

let s = ''; 

s = zxc + ''; 
+0

아마 여기에 찾고있는 정보가 포함되어 있습니까? https://www.html5rocks.com/en/tutorials/speed/v8/ –

+0

@Shyam 거의 ... – Hydro

+0

javascript는 빠른 액세스를위한 모든 것을 최적화하는 것입니다 ... –

답변

1

예 대체

let s = ''; // let s : String 

s = zxc; // What is zxc? 

zxc 퍼팅.

예를 들어, 2012 년부터 V8 태그는 32 비트이므로 모든 계산이 훨씬 빠릅니다. 증명 https://www.html5rocks.com/en/tutorials/speed/v8/#toc-topic-numbers

크랭크 축은 변경되지 않은 유형의 모든 필드 액세스를 가속화하기 위해 모든 곳에서 하이브리드 유형 추론을 도입합니다.

현재 점화는 점점 더 잘되고 물론 필드 유형에 대한 지식을 사용하여 원시 코드 경로를 만듭니다.

그리고 누군가가 예측 된 유형의 가치를 알려진 분야에 쓸 때 자체적으로 가격이 낮아집니다.

+0

불행히도 아직 유형 태그 지정과 관련이 없습니다. : / – Hydro

1

(여기 V8 개발자.) 짧은 대답은 "예"입니다. 오랜 대답은 복잡합니다.

let s = ''; 예와 같이 직접 "변수에 대한 유형 추정"이 없습니다. 정확하게 다음 할당이 s = 1 일 수 있기 때문입니다.

그런데 현대 자바 스크립트 엔진 (V8 등)이 최적화 된 코드를 생성하는 기본적인 원칙 중 하나는 프로그램의 특정 지점에서 어떤 유형이 표시되었는지 관찰하는 것입니다. 당신이 ... = s + t, 지금까지 st이있을 때 예를 들어, 항상 문자열을 가지고, 다음 최적화 된 코드는 일련의 대략 같은 포함됩니다

check if the value in s is a string, otherwise bail out; 
check if the value in s is a string, otherwise bail out; 
perform a string concatenation of the two values; 

"구제"즉, 전체 기능에 대한 최적화 된 코드 버려지고 유형에 대해 구워진 가정을하지 않는 최적화되지 않은 코드 (또는 바이트 코드)로 실행이 계속됩니다. 새로 최적화 된 코드는 유형에 대한 업데이트 된 정보를 기반으로 나중에 생성되거나 생성되지 않을 수 있습니다. 이 접근법은 보통 "유형 유추"라고 불리는 것이 아닙니다.

JavaScript의 직접 "유형 추론"은 매우 제한된 상황에서만 가능합니다. 예를 들어, 비트 연산 (예 : |, &, ~)의 결과는 항상 32 비트 정수입니다. 단항 더하기 (즉, +foo)의 결과는 항상 숫자입니다. 문자열을 다른 것에 추가 한 결과는 항상 문자열입니다. 컴파일러 최적화는 일반적으로보다 효율적인 코드를 생성하는 규칙을 적용합니다.