문제

Tracemonkey, Squirrelfish 및 V8 Projects를 통해 많은 Capital C, Capital S Computer Science가 JavaScript에 들어가는 것이 많이 있습니다. 이러한 프로젝트 (또는 기타) 중 어느 것도 DOM 운영의 성능을 다루거나 순전히 JavaScript 계산과 관련이 있습니까?

도움이 되었습니까?

해결책

순수한 DOM 운영 (GetElementById/tagname/selector, NextChild 등)의 성능은 이미 순수한 C ++에 있으므로 영향을받지 않습니다.

JS 엔진 개선이 성능에 영향을 미치는 방법은 성능 향상에 사용되는 특정 기술과 DOM-> JS 브리지의 성능에 달려 있습니다.

전자의 예는 모든 통화에 대한 Tracemonkey의 JS 기능에 대한 의존성입니다. 트레이스는 JS가 상거할 수없는 코드를 때리는 지점 (기본 코드, 진정한 다형성 재귀, 예외 처리기)이 발생하고 실행이 중단되고 실행이 통역사로 떨어집니다. TM 개발자는 추적 할 수있는 코드의 양 (다형성 재귀 처리 포함)을 개선하기 위해 많은 노력을 기울이고 있지만, 임의의 기본 기능 (예 : DOM)에 대한 호출을 통해 현실적으로 추적하는 것은 실현 가능하지 않습니다. 이런 이유로 나는 그들이 JS에서 더 많은 DOM을 구현하고 있다고 생각합니다 (또는 적어도 JS 친화적 인 방식으로). 즉, 코드가 추적 할 수있는 경우 TM은 대부분의 "객체"를보다 효율적이고 기본 등가물로 낮출 수 있으므로 예외적으로 좋은 작업을 수행 할 수 있습니다 (예 : JS 번호 구현 대신 기계 INT를 사용).

JavaScriptCore (Squirrelfish Extreme Lives)와 V8은 모든 JS 코드를 즉시 Jit하고 더 투기적인 코드를 생성한다는 점에서 더 유사한 접근 방식을 가지고 있습니다 (예 : 수행중인 경우. a*b 그들은 가정하는 코드를 생성합니다 a 그리고 b 숫자는 숫자이며 그렇지 않은 경우 예외적으로 느린 코드로 돌아갑니다). 이것은 추적에 대한 여러 가지 이점, 즉 기본 코드/던지기 예외 등을 호출하는지 여부에 관계없이 모든 코드를 Jit 할 수 있다는 것입니다. 즉, 단일 DOM 호출이 성능을 파괴하지 않을 것입니다. 단점은 모든 코드가 투기 적이라는 것입니다 -TM ~ 할 것이다 Math.floor 등에 대한 인라인 호출이지만 가장 좋은 JSC/V8은 다음과 같습니다. a=Math.floor(0.5) -> a=(Math.floor == realFloor) ? inline : Math.floor(0.5) 이것은 성능과 메모리 사용에 비용이 들며 특히 실현 가능하지 않습니다. 그 이유는 상점 컴파일이지만 TM은 실행 후 JITS 코드 만 (그리고 정확히 어떤 함수를 호출했는지 알고 있습니다) JSC와 V8은 그러한 가정을 할 수있는 실제 근거가 없으며 기본적으로 추측 할 필요가 없습니다 (그리고 현재 시도는 없습니다. 이것). V8과 JSC 가이 문제를 시도하고 보상하려고하는 한 가지는 과거에 본 것을 추적하고 실행 경로에 통합하는 것입니다. 특히 뜨거운 경우에는이 캐싱을 수행하는 기술 조합을 사용합니다. 그들은 지시 스트림의 작은 부분을 다시 작성하고 다른 경우에는 밴드 캐시를 피합니다. 코드가있는 경우 광범위하게 말하면

a.x * a.y

V8과 JSC는 '암시 적 유형'/'구조'를 두 번 확인합니다. 각 액세스마다 한 번 확인한 다음 확인합니다. a.x 그리고 a.y TM은 두 숫자이며 TM은 유형을 확인하는 코드를 생성합니다. a 한 번만, 그리고 (모든 것이 평등 한) a.x 그리고 a.y 그들이 숫자를 확인하지 않고.

순수한 실행 속도를보고 있다면 현재 각 엔진이 다른 작업보다 특정 작업에서 더 잘 작동하는 것처럼 보이기 때문에 혼합 가방이 있습니다. 많은 순수한 수학 테스트에서 Tracemonkey가 승리하고, 역동적 인 경우에서 V8이 승리하고, JSC가 승리하면 JSC가 승리합니다. 혼합. 물론 오늘날 사실이지만 우리는 모두 성능을 향상시키기 위해 열심히 노력하고 있기 때문에 내일이 아닐 수도 있습니다.

내가 언급 한 또 다른 문제는 DOM <-> JS 바인딩 비용입니다. 이것은 실제로 웹 성능에서 매우 중요한 역할을 할 수 있습니다. 가장 좋은 예는 Dromaeo 벤치 마크에서 Safari 3.1/2 vs Chrome입니다. Chrome은 Webkit의 Safari 3.1/2 지점을 기반으로하므로 유사한 DOM 성능을 가정하는 것이 안전합니다 (컴파일러 차이는 어느 정도의 차이를 유발할 수 있음). 이 벤치 마크 Safari 3.1/2는 실제로 훨씬 느린 JS 엔진을 가지고 있음에도 불구하고 크롬을 실제로 이깁니다. 이것은 기본적으로 JSC/웹 코어 (WebKit의 DOM/렌더링/etc)와 V8/Webcore 간의보다 효율적인 바인딩 때문입니다.

현재 TM의 DOM 바인딩을보고있는 모든 작업을 완료하지 못했기 때문에 (아아)는 해석자에게 물러나 기 때문에 불공평 해 보입니다.

..

Errmmm, 의도 된 것보다 다소 오래 진행되었으므로 원래 질문에 대한 짧은 대답은 "의존적"입니다.

다른 팁

그들은 순수한 자바 스크립트입니다. 특정 DOM 메소드 호출이 구현되지 않는 한 안에 JS, 그들은 효과가 거의 없을 것입니다 (감소에 대한 작업이 없다고 말할 것도 없습니다. 간접비 그러나 그러한 전화의 경우).

DOM 최적화는 전체 'Nother Kettle입니다 다람쥐 원숭이 거미 물고기 ... 레이아웃과 렌더링 엔진이 작용하며 각 브라우저에는 자체 구현 및 최적화 전략이 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top