2011-07-05 2 views
16

JavaScript의 객체는 Hashtable로 사용할 수 있습니다 (키는 String이어야합니다) Hashtable처럼 데이터 구조가 잘 작동합니까?JavaScript VM은 객체 속성 액세스를 어떻게 구현합니까? 해시 테이블인가?

내 말은 장면 뒤에 Hashtable로 구현 되었습니까?

업데이트 : : (1) 해시 테이블을 hashtable (2)으로 변경했습니다. 대부분의 브라우저가 동일하지 않더라도 그렇게 구현한다고 생각하십니까? 거기에 ECMAScript 사양을 구현하는 방법에 대한 요구 사항이 있습니까?

업데이트 2 : V8과 Firefox JS VM이 어떻게 Object.properties getters/setter를 구현하는지 궁금합니다.

+2

글쎄, 당신의 의견에 "의 HashMap"는 무엇인가? – Gumbo

+0

나는 그가 java.util.HashMap을 언급하고 있다고 생각한다. 이것은 같은 것이 아니다. –

+1

자바 스크립트는 자바가 아니며 자바를 통해 구현되지 않습니다. – Victor

답변

23

V8은 실제로 더 나은 방법으로 그것을 구현하는 개체의 속성을 해시 테이블로 액세스 (현명한 성능)를 구현하지 않습니다

어떻게 작동합니까? "V8은 속성에 접근하기 위해 동적 인 룩업을 사용하지 않고 V8은 숨겨진 클래스를 동적으로 생성합니다. 즉, C++ 객체의 속성에 액세스하는 것보다 속성에 거의 빨리 액세스 할 수 있습니다.

왜? 고정 된 클래스의 각 속성이 .. 특정 고정 된 오프셋 위치에서 찾을 수 있기 때문에

V8에서 객체의 일반적인 접근 속성 그래서

은가 어떻게 작동하는지 잘 모르겠어요

.. 해시 테이블보다 빠르다 다른 VM

더 많은 정보는 여기에서 찾을 수 있습니다 : 당신은 여기 JS에서 더 많은 관련 해시 테이블을 읽을 수 https://developers.google.com/v8/design#prop_access

: (내 블로그) http://simplenotions.wordpress.com/2011/07/05/javascript-hashtable/

+1

V8 디자인 문서 링크가 깨졌습니다. 이 아이디어가 나간 아이디어가 있습니까? – Jules

+4

새 문서 링크는 https://developers.google.com/v8/design#prop_access –

+0

입니다. 런타임시 임의의 키를 생성 할 수있는 객체의 정적 클래스를 어떻게 만들 수 있습니까? 확실히 모든 경우에 이것을 할 수는 없습니다. – devios1

8

"브라우저의 대부분이 똑같이 구현하는 것 같지만 그렇지 않은 이유는 무엇입니까? ECMAScript 사양에서 구현하는 방법에 대한 요구 사항이 있습니까?"

저는 전문가는 아니지만 언어 사양이 내부적으로 구현되어야하는 방식을 정확히 설명하는 이유를 생각할 수 없습니다. 그러한 제약은 퍼포먼스가 아닌 다른 방법으로 언어의 기능에 영향을 미치지 않기 때문에 전혀 목적이 없습니다. "

-

편집 두 downvotes에도 불구하고, 사실이 절대적으로 정확하고 사실에 특히 사양의 section 8.6.2에 desscribed 된 ECMA-262 사양의 구현 독립이다 이 테이블의 설명은 고유 한 ECMAScript 객체에 대해이 문서에서 달리 언급하지 않는 한 네이티브 ECMAScript 객체에 대한 동작을 나타냅니다. 호스트 객체는 해당 객체와 일치하는 한 구현 의존적 동작으로 이러한 내부 속성을 지원할 수 있습니다. 이 문서에 명시된 특정 호스트 객체 제한 "

"호스트 개체는 달리 지정하지 않는 한 이러한 내부 방법을 구현할 수 있습니다."

"해시"라는 단어는 전체 ECMA-262 사양에 나타나지 않습니다.

(원본, 계속) 말에 Javascscript의

구현, 인터넷 익스플로러 6.0과 구글 크롬의 V8 거의 공통점하지만, 같은 사양에 (다소) 모두 준수이 없습니다.

특정 자바 스크립트 인터프리터가 어떤 작업을하는지 알고 싶다면 해당 엔진을 구체적으로 조사해야합니다.

해시 테이블은 상호 참조를 만드는 효율적인 방법입니다. 그것들이 유일한 방법은 아닙니다. 일부 엔진은 예를 들어 해시 테이블의 오버 헤드가 덜 효율적인 작은 세트에 대해 저장소를 최적화 할 수 있습니다.

하루의 끝에, 당신이 알아야 할 것은 작동한다는 것입니다. ajax를 사용하거나 메모리에서조차도 큰 세트의 룩업 테이블을 만드는 더 빠른 방법이있을 수 있습니다. 예를 들어, 트라이 데이터 구조 사용에 관한 흥미로운 토론을 참조하십시오 (this post from John Reseig's blog).

하지만 여기서도 마찬가지입니다.이 객체 또는 네이티브 JS 객체의 사용 여부는 JS가 객체를 구현하는 방법에 대한 정보로 이루어져서는 안됩니다. 퍼포먼스 비교에 의해서만 구동되어야합니다 : 각 방법은 어떻게 확장됩니까? 이 정보는 JS 엔진 구현에 대한 정보 만 제공하는 것이 아니라 성능 테스트를 통해 얻을 수있는 정보입니다.

+0

downvotes 주셔서 감사합니다 - 내 대답에 대해 부정확 한 것이 있다면,이 질문을 읽고 설명하거나 설명하기 위해 다른 사람에게 훨씬 더 유용 할 것입니다. –

+3

질문은 실제 구현 ("장면의 배후")에 관한 것입니다. 사양이 * 특정 솔루션을 요구하지 않는다고 말하는 것은 제한된 도움이됩니다. – kassens

+2

예. 성능 고려 사항은 실제 데이터로 인해 야합니다. 그러나 구현 전략을 아는 것은 매우 유용한 발견 적 방법이며, 벤치 마크에서 냅킨을 처음으로 사용하는 것은 매우 저렴합니다. 게시물에 유용한 정보가 많이 있지만 OP의 질문은 여전히 ​​유효합니다. –

관련 문제