3

나는 내가 더 잘 수행 할 것으로 예상했던 몇 가지 새로운 코드와 성능 문제가 된 일부 코드를 교체 한이 새로운 코드가 이전 코드보다 느린 이유는 무엇입니까?

질문. 대신, 그것은 더 나빴다. 왜 내가 크롬 V8 런타임을 사용하지 않고 작업 할 수 있는지 이해하고 싶습니다.

배경

내 코드는 브라우저 기반의 게임이다. 정상적인 작동 중에는 많은 xy 좌표가 함수간에 전달됩니다.

function doSomething1(x,y) { 
    /* Do work here */ 
    return {x: newx, y: newy}; 
} 

function doSomething2(x,y) { 
    /* Do work here */ 
    return {x: newx, y: newy}; 
} 

function doSomething3(x, y) { 
    var result1 = doSomething1(x, y); 
    var result2 = doSomething2(result1.x, result1.y); 

    /* Do work here */ 
    return {x: newx, y: newy}; 
} 

당신은 아이디어를 얻을 .. XY 특성을 가진 작은 익명의 객체를 반환하고 밖으로 값을 뽑고, 서로를 호출하는 기능의 많은 : 나는 '고정'일하기 전에이의 예는 다음과 같이 보였다.

내 게임을 실행하면 가비지 수집 문제가 발생합니다. 메모리 그래프가 매우 스파이 키이며 프레임 속도가 매끄럽지 않습니다.

function doSomething(x,y,out) { 
    /* Do work here */ 
    out[0] = newx; 
    out[1] = newx; 
} 

var xy = [0,0]; /* Some 2-length array for results */ 
doSomething(5,6,xy); 
/* 'Return' value in xy */ 

이러한 방법이 하나의 '할당'과는 아래 함수를 호출로 값이 배열에 교체 : 그것은이 패턴을 따라 수 있도록이 문제를 완화하기 위해, 내 코드를 다시 쓰기로했다 체인.

실제로 메모리 할당 그래프를 부드럽게하는 효과가있었습니다. 또한 프레임 속도를 50 % 줄이는 예상치 못한 부작용이있었습니다!

왜 이렇게해야합니까? 내가 피할 수있는 최적화가 무엇입니까? 어떻게 V8 런타임에서 작동하도록이 코드를 작성할 수 있습니까?

업데이트

추가 조사는 코드가 50 % 느린 사실에없는 것으로 나타났다. 새 코드가 127.0.0.1에서 호스팅되고 인터넷의 이전 코드가 호스팅 될 때만 느려졌습니다. 이것은 이상하지만, 같은 질문이 아닙니다. 나는이 질문을 닫을 것이다.

+0

가능한 이유는 'out'배열을 동적 크기로 사용한다는 것입니다. 고정 된 크기의 배열을 만들고 결과를 알려주시겠습니까 :) 당신은 얼마나 많은 요소를 갖고 있는지 언급하지 않았으며이 정보를 추가 할 수 있습니까? – Warlock

+0

"조기 최적화는 모든 악의 근원"- Donald Knuth – Warlock

답변

0

당신이

out[0] = newx 

V8 만 '0'필드와 새로운 객체를 할당하고 그것으로 newx 스틱을 알 쓸 때. 당신이

out[1] = newy 

계속되면 그것은 단지 할당 된 객체를 추적하고, '1'필드에 대한 더 많은 공간을 할당 할 수 있습니다. 후자의 경우 V8은 이미 얼마나 많은 필드가 있는지 알고 있기 때문에 이것은 {x: newx, y:newy}보다 훨씬 비쌉니다.

자바 스크립트 또는 게임을 최적화하는 방법에 대해 많이 알지 못하므로 추가 권장 사항을 작성하기가 어렵습니다. 다행히 이미 알고리즘 문제를 살펴보고 이제는 미세 조정을 시도하고 있습니다. 알고리즘은 큰 개선이 이루어질 수있는 곳입니다.

관련 문제