문제

캐시 미스를 줄이는 것과 관련하여 객체의 메모리 레이아웃은 특히 콘솔에서 작업 할 때 매우 중요합니다.데이터 지향 디자인은 종종 객체 지향 디자인보다 선호되며,관련 객체를 메모리에서 서로 가까이 유지하도록 도와줍니다(특히 성능이 중요한 영역에서).

최근에 나는 자바 스크립트 개발을 해왔고 자바 스크립트 커뮤니티 내에서 일반적인 합의가 무엇인지 궁금합니다.

자바 스크립트에서 내 제한된 경험으로,나는 종종 프로파일 링 할 때 완전히 예상치 못한 결과를보고 놀랐습니다.자바 스크립트 객체/구조의 내부 메모리 레이아웃 및 구현은 브라우저마다 매우 다양하므로 최적화하려는 노력이 가치가 있는지 궁금합니다.

간단한 테스트 케이스를 만들었습니다.http://jsperf.com/object-vs-data)를 통해 두 가지 방법의 성능을 비교할 수 있으며,크롬에서 성능 향상을 보여 주지만 사파리에서는 눈에 띄는 속도 향상이 없습니다.

자바 스크립트에서,나는 심지어 객체의 메모리 레이아웃에 관심을 가져야합니까?또는'한 가지 방법으로 구현 한 다음 필요한 경우 최적화'유형의 것이 더 많습니까?

이 두 번째 옵션은 특히 따라야 할 좋은 지침이 있는 경우(개발 시간 측면에서)낭비적인 것 같습니다.

감사~

추가 정보:이것은 기본적으로 내가 자바 스크립트에서 두 가지 접근 방식을 구현하는 방법입니다.위의 테스트 케이스는 다음과 같이 구현됩니다.

var objectOriented = [
    { foo: 1, bar: 2 },
    { foo: 3, bar: 4 }
];

var dataOriented = {
    foos: [1, 3],
    bars: [2, 4]
};

// Object-oriented access:
var a = objectOriented[0].bar;

// Data-oriented access:
var b = dataOriented.bars[0];
도움이 되었습니까?

해결책

자바스크립트의 객체는 다음과 같이 작동합니다.그들은 그렇지 않습니다.

에 씨++,유형의 주요 목적은 메모리 덩어리 위에"렌즈"역할을하는 것입니다.클래스 레이아웃은 객체가 설명하는 메모리의 내용을 잘 정의된 방식으로 직접 정의합니다.특히 균질 유형의 선형 연속 레이아웃이 필요합니다.

자바스크립트에서 객체는 이름/값 쌍의 집합입니다.배열은 특별한"길이"속성을 가진 객체 일뿐입니다.여기에 메모리 레이아웃에 대한 설명이나 정의가 없습니다.자바 스크립트 인터프리터가 선형 메모리 덩어리가 아닌 해시 테이블로 배열을 구현하는 것을 막을 수있는 것은 없습니다;사실,나는 그들이 단지 그렇게 하는 제이스 구현이라고 확신합니다.

자바스크립트 구현은 원하는 대로 메모리를 자유롭게 배치할 수 있습니다.그리고 소스에서 하는 일과 실제로 기계에서 끝나는 일 사이에 대응이 없습니다.

또한 자바 스크립트 배열은 균일하지 않고 이질적입니다.즉,연속 메모리에 배치되었다고 가정 할 때,당신의 동등한 유형은**가 아니라**(또는 부동**또는 무엇이든)이 될 것입니다.따라서 참조가 캐시 라인에 있더라도 데이터는 저장되지 않습니다.

그래서,요약하면-이런 종류의 생각은 당신에게 고통 외에는 아무것도 얻지 못할 것입니다.자바스크립트는 보다 높은 수준의 언어입니다.가능한 경우 이러한 종류의 저수준 최적화는 인터프리터에 의해 수행됩니다.자연스럽게 솔루션을 표현하는 효율적인 알고리즘으로 코드 작성에 집중;그것은 충분히 어렵습니다.:-)

다른 팁

좋아몇 가지 숫자와 테스트 케이스를 만지작 거립니다..

먼저이 테스트 케이스를 만들었습니다 http://jsperf.com/object-vs-array-creation-for-so 이 경우, Object더 빠른 방법 그런 다음 Array

둘째,이 테스트 케이스를 만들었습니다 http://jsperf.com/accessing-speed 이 점에서 그들 사이에 거의 차이가 없었습니다..

그래서,이 프로필에서 추론 한 것은 프로젝트가 다음과 같은 경우 배열보다 더 많은 객체를 사용하는 것이 더 빠를 것입니다 정말 거대한..첫 번째 경우부터 객체 생성이 배열 생성보다 빠르다는 것이 분명합니다.

하지만.

자바 스크립트는 고도로 발달 및 성능 언어이며 이러한 마이크로 최적화에 대해 걱정할 필요가 없습니다.당신이 집중해야 하는 모두는 의미론.당신은 당신의 의도를 가장 잘 설명하는 구조를 선택해야합니다..

윈도우 6.3 에서 크롬 36.0.1985.125 에서 테스트

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