2012-10-18 4 views
1

객체가 함수로 전달되면 해당 객체는 값으로 전달되지만 객체의 값은 참조입니다. 매우 큰 객체를 내 함수로 전달하지만 함수 내에서 소수의 속성 (6-12) 만 액세스합니다. Memorywise, 전체 개체 대신 속성을 전달하는 것이 더 낫습니까? 아니면 내 속성이 문자열 인 경우 실제로 더 많은 메모리 문제가 발생합니까?함수에 전달 된 객체의 메모리 사용량/가비지 컬렉션

아래의 두 함수가 주어지면 메모리는 어떻게됩니까? f1에서 javascript/v8은 메모리에 새로운 객체 foo를 만들거나 정말로 포인터일까요? 문자열 속성에 액세스하거나 V8에서 함수 내에서 사용하기 위해 해당 문자열의 복사본을 만드는 경우 포인터로만 남아 있습니까? f2에서는 문자열 foo의 완전히 새로운 복사본이 함수에 대해 만들어진 것으로 가정합니다. 이것은 올바른 가정입니까?

function f1(x) { 
    var y = x.foo; 
} 

function f2(foo) { 
    var y = foo; 
} 

var obj = {foo: "test"}; 
f1(obj); 
f2(obj.foo); 
+0

예, * 값은 단지 포인터입니다. 문자열이 없기 때문에 문자열을 변경할 수 없기 때문에 복사본이 만들어졌습니다. 다시 메모리에 대한 포인터 일뿐입니다. – Bergi

답변

1

"단지 전체 개체 대신 속성을 통과? 아니면 내 속성 문자열 경우이 실제로 메모리 문제 등을 만들 것에 Memorywise, 그것은 더 나은 것?"

더 많은 메모리가 필요합니다. 문자열이 일반적으로 참조 유형으로 구현되기 때문에 문자열 인 경우 실제로는 중요하지 않지만 각 인수에 대해 Object 참조의 단일 사본 대신 값의 사본이 있습니다.

개체 참조가 매우 가볍기 때문에 개체의 모든 개별 구성원 대신 복사 할 수 있습니다.

또한 함수 내에서 개체의 변이에 의존하는 경우이 옵션이 필요합니다. 당신의 예에서


은 (문자열)전달되는 하나의 특성이있다. 코드가 객체 자체의 돌연변이에 의존하지 않으면 두 객체 사이에 큰 차이가 없습니다.

개체를 전달하는 예제에서 유일한 복사본은 개체 참조입니다. 그것은 포인터가 아니지만 매우 가벼우 며 걱정할 것도 없습니다.

문자열을 전달하는 예제에서는 전체 문자열의 복사본을 만드는 것처럼 보이지만 스팅은 JavaScript에서 변경되지 않으므로 구현에서는 일반적으로 참조 유형으로이를 구현합니다.

따라서 10,000 자 문자열을 전달하는 것처럼 하나의 문자열을 전달하는 것이 효율적입니다.

+0

나는 함수 내에서 돌연변이를하고 있지 않다. 그들의 목적은 함수 내에서 일어날 일을 결정하는 것입니다 : ie : if (obj.foo = x) ... 그래서, 나는 하나의 커다란 물체가 갈 길이라고 생각합니다. 기본적으로 이것은 API이며 요청 (클라이언트가 누구인지 - 다중 클라이언트 응용 프로그램, 사용자, 요청한 것, 요청하는 방법 등)에 대한 많은 상태 정보를 추적해야합니다. 다른 대형 객체를 포함하는 requestContext 객체를 만들었고이 requestContext 객체를 저에게 관심을 갖기 시작한 곳으로 전달했습니다. 감사! – AlexGad

+0

@AlexGad : 천만에 환영합니다. 그렇습니다. 만약 내가 추측한다면, 아마 당신이 지나가는 64 비트라고 말할 수 있습니다. 그러나 궁극적으로 API에 대해 의미있는 일을하십시오. 특정 함수가 단일 값의 유효성을 검사하기 만하면 지정된 환경에서 더 적합한 경우 해당 값을 전달하십시오. –

관련 문제