문제

다음 JavaScript 함수를 고려하십시오 (1) :

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

이제이 기능에서 내가 좋아하지 않는 것은 함수가 호출 될 때마다 동일한 객체가 생성된다는 것입니다. 객체가 변경되지 않기 때문에 한 번만 만들려고합니다. 그래서 우리는 다음과 같은 조정을 할 수 있습니다 (2).

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

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

이제 스크립트가로드되고 저장 될 때 객체가 한 번 생성됩니다. dataObject. 그러나 그것을 가정합시다 setData 때때로 만 불러옵니다. 스크립트가로드되는 대부분의 시간은 함수가 사용되지 않습니다. 이 경우이 기능에 대해 내가 좋아하지 않는 것은 객체가 항상 사용되지 않는 많은 경우를 포함하여 항상 메모리로 만들어지고 고정된다는 것입니다. 이상적인 균형을 맞추기 위해 이와 같은 일을 할 수 있다고 생각했습니다 (3).

var dataObject;

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

그게 말이 될까요? 통역사가 객체를 만들기로 결정할 때에 달려 있다고 생각합니다. 실제로 통과 할 때까지 기다립니다 !dataObject 조건, 아니면 함수를 입력하고, 똑똑하고 미리 구성하기로 결정합니까? 아마도 다른 JavaScript 엔진이 이와 관련하여 다른 정책을 가지고 있습니까?

물론 이러한 최적화가 실제로 문제가 될지에 대한 의문이 있습니다. 분명히 이것은 물체의 크기, 엔진 속도, 이용 가능한 자원의 양 등과 같은 요소에 따라 다릅니다. 그러나 일반적으로, 당신이 말하는 것은 더 중요한 최적화입니다. (1)에서 (2) 또는 (2)에서 (3)에서?

도움이 되었습니까?

해결책

대답은, 당신은 알지 못해야한다는 것입니다. 당신이 보여준 예는 그들 사이에 거의 차이가 없습니다. 당신이 이것에 대해 합리적으로 걱정할 수있는 유일한 방법은 당신이 특정한 방법이나 다른 방법으로 특정 통역사에서 성능이나 메모리 사용을 해치고 있다는 실제 증거를 가지고 있다면입니다. 그때까지, 당신을 위해 그 물건에 대해 걱정하는 것은 통역사의 일입니다.

그것은 당신이 정말로 알고 싶다면 ... 시도해보고 알아보십시오. 다른 버전을 1,000,000 번 호출하고 그 차이가 무엇인지 확인하십시오.

대상의 거대한 버전을 만들고 그것이 움푹 들어간 곳이 있는지 확인하십시오. 작업 관리자를보십시오. 다른 브라우저를 사용해보십시오. 결과를 다시보고하십시오. 인터넷에서 많은 바보들에게 그들이 생각할 수있는 것을 물어 보는 것보다 훨씬 더 좋은 방법입니다.

어쨌든 물체는 어쨌든 기억에 있어야한다는 점을 명심하십시오 ... 소스 텍스트

다른 팁

새로운 객체를 만들어야합니다. 사양이 필요하기 때문에 부분적으로는 할 수는 없지만 대부분 대안 적 행동이 직관적이기 때문에 다음과 같습니다.

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; }
})();

반환하는 객체가 변경 될 수있는 완전히 변한 객체라는 것을 알아야하지만 모든 사람이 동일한 돌연변이 인스턴스를 공유 할 것임을 알아야하지만 원하는 효과를 얻을 수 있습니다.

먼저 상황 #2에서 구현하고 페이지가로드 된 직후에 한 번만로드했습니다.

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

물체를 만드는 것이 매우 비싸면 (비교적 말하면) 상황 #3으로 이동합니다.

실제로 당신에게 아무것도 사지 않으면 'if'진술을 추가 할 필요는 없습니다 ...이 경우 단순/큰 물체를 만드는 것은 CPU의 뒷면에서 땀이 나지 않습니다. 측정이 없으면 최적화하지 않습니다. 블라인드를 촬영하는 것만 촬영합니다.

실제로 C ++ 및 Java에서 개인적으로 사용했던 것들을 초기화하는 상당히 일반적인 방법입니다.

첫째,이 최적화는 실제로 중요하지 않습니다.

둘째, 마지막 함수는 첫 번째 기능만큼이나 좋습니다. 글쎄, 거의. 처음에 나는 당신이 가비지 수집가의 자비에 있다고 생각합니다. domElement.myDataProperty. 그럼에도 불구하고 쓰레기 수집가가 대상 플랫폼에서 어떻게 작동하는지 정확히 알지 못하고 (브라우저마다 매우 다를 수 있음) 실제로 작업을 저장하는 것을 확신 할 수는 없습니다.

두 브라우저에서 세 가지를 모두 시도하고 어느 것이 더 빠른지 알아보십시오.

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