2009-08-12 4 views
3

고려 다음과 같은 자바 스크립트 기능 (1) :자바 스크립트의 객체는 언제 구성됩니까?

function setData(domElement) { 
    domElement.myDataProperty = { 
    'suppose': 'this', 
    'object': 'is', 
    'static': 'and', 
    'pretty': 'big' 
    }; 
}; 

이제 제가이 기능을 좋아하지 않는다 동일한 객체가 함수가 호출 될 때마다 생성되는 것입니다. 객체가 변경되지 않으므로 오히려 한 번만 만들 것입니다. 스크립트가로드 dataObject에 저장 될 때

var dataObject = { 
    'suppose': 'this', 
    'object': 'is', 
    'static': 'and', 
    'pretty': 'big' 
}; 

function setData(domElement) { 
    domElement.myDataProperty = dataObject; 
}; 

지금 개체가 한 번 생성됩니다 그래서 우리는 다음과 같은 조정 (2)를 만들 수 있습니다. 그러나 setData이 가끔씩 만 호출된다고 가정 해 봅니다. 스크립트가로드되는 대부분의 시간 동안 함수가 사용되지 않습니다. 이 경우이 함수에 대해 마음에 들지 않는 것은 객체가 항상 사용되지 않을 때를 포함하여 항상 메모리에 만들어지고 유지된다는 것입니다. 당신이 이상적인 균형을 맞추기 위해 이렇게 할 수있을 것이라고 생각했습니다. (3) :

의미가 있습니까? 나는 인터프리터가 언제 객체를 만들지 결정하는 것에 달려 있다고 생각한다. !dataObject 조건을 통과 할 때까지 실제로 기다리지 않습니까? 아니면 기능에 들어가 스마트하게하려고 사전에 구성하기로 결정합니까? 아마도 Javascript 엔진마다 이와 관련하여 다른 정책이 있을까요?

물론 이러한 최적화가 실제로 중요한지 여부에 대한 질문이 있습니다. 분명히 이것은 객체의 크기, 엔진의 속도, 사용 가능한 리소스의 양 등과 같은 요소에 달려 있습니다.하지만 일반적으로 어느 것이 더 중요한 최적화라고 할 수 있습니다 : (1)에서 (2) 또는 (2)에서 (3)까지?

답변

2

대답은 당신이 알기로되어있는 것이 아닙니다. 보여준 예제는 그 차이가 거의 없습니다. 한 가지 다른 방법이 특정 통역사의 성능이나 메모리 사용을 현저하게 해치고 있다는 실제적인 증거가있는 경우에만 합리적으로 걱정할 수있는 유일한 방법입니다. 그때까지는 통역사가 당신을 위해 그 물건에 대해 걱정하는 것입니다.

당신이 정말로 알고 싶다면 ...그것을 시도하고 알아보십시오. 서로 다른 버전을 1,000,000 번이나 부르며 어떤 차이가 있는지 확인하십시오.

개체의 거대한 버전을 만들고 이것이 움푹 들어간 지 확인하십시오. 감시 작업 관리자. 다른 브라우저를 사용해보십시오. 결과를보고하십시오. 인터넷에서 그들이 얼마나 추측 하는지를 묻는 것보다 훨씬 더 좋은 방법입니다. 사양이 그것을 필요로 부분적으로 있기 때문에, 그것은하지 않을 수 없습니다 -

소스 텍스트

1

우선, 상황 2에서 구현하고 페이지가로드 된 직후에 한 번로드합니다.

페이지 속도에 문제가있는 경우 페이지 내 특정 작업에 소요 된 시간을 측정합니다.

개체를 생성하는 데 비용이 많이 든다면 (상대적으로 말하면), 나는 상황 # 3으로 이동할 것입니다.

'if'문을 실제로 추가로 구입하지 않으면 추가 할 점이 없습니다.이 경우 간단하거나 큰 개체를 만드는 것이 CPU 뒷면에 땀을 흘리지 않습니다. 측정하지 않으면 최적 화가되지 않습니다.

사실은 C++ 및 Java에서 개인적으로 사용한 것들을 초기화하는 일반적인 방법입니다.

1

먼저이 최적화는 실제로 중요하지 않습니다.

둘째, 마지막 함수는 첫 번째 함수와 똑같습니다. 음, 거의. 처음에는 가비지 컬렉터가 자비를 베풀고 있다고 가정하고 domElement.myDataProperty을 재 할당 할 때 이전 객체를 파괴해야합니다. 그래도 가비지 수집기가 대상 플랫폼에서 작동하는 방식을 정확히 모르는 경우 (브라우저간에 매우 다를 수 있음) 실제로 작업을 저장하는 것은 확실하지 않습니다.

2

새로운 객체를 생성해야하기 때문에 ... 관계없이, 어쨌든 메모리에 수를 가지고 객체를 염두에 두어야 다른 행동이 카운터 직관적 인 것 대부분이 있기 때문에, 가지고 :

function f() { 
    return {a : "b", c: "d"}; 
} 
o=f(); 
alert([o.c, o.e]); // Alerts "b," 
delete o.c; 
o.e="f"; 
o=f(); 
alert([o.c, o.e]); // If the object was only created once this would produce ",f" 

당신은 정말 실제로 당신이 요구하고있는 객체를 생성하지에 새로운 객체 표현을 기대 하는가? 그게 당신이 원하는 것처럼 보이기 때문이죠.

은 알만 그냥하고 싶은 : 당신은 당신이 복귀하고있는 객체가 변경 될 수 완전히 변경 가능한 객체 인 것을 깨닫게해야하지만, 원하는 효과를 얻을 것
var myFunction = (function(){ 
    var object = {a: "b", c: "d"}; 
    return function() { return object; } 
})(); 

하고, 모든 사람들이 그 같은 돌연변이를 공유하게 될 것입니다.

+0

좋은 점이 있지만, 여기서는 일반적인 기능과 같이 여기서 결코 바뀌지 않을 객체에 대해 이야기하고 있다는 것을 명심하십시오. –

+0

은 중요하지 않습니다. JS는 변경 될 수 있다고 말합니다. 변경하지 않으려는 사실은 부적절합니다. 당신은 '돌아올 것을 기대할 것입니까? 1,2,3]; 예를 들어 언제나 같은 객체를 반환 할 것인가? – olliej

1

두 가지 브라우저에서 세 가지를 모두 시도해보고 더 빠른 것을 찾으십시오.

관련 문제