나는 내가 더 잘 수행 할 것으로 예상했던 몇 가지 새로운 코드와 성능 문제가 된 일부 코드를 교체 한이 새로운 코드가 이전 코드보다 느린 이유는 무엇입니까?
질문. 대신, 그것은 더 나빴다. 왜 내가 크롬 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에서 호스팅되고 인터넷의 이전 코드가 호스팅 될 때만 느려졌습니다. 이것은 이상하지만, 같은 질문이 아닙니다. 나는이 질문을 닫을 것이다.
가능한 이유는 'out'배열을 동적 크기로 사용한다는 것입니다. 고정 된 크기의 배열을 만들고 결과를 알려주시겠습니까 :) 당신은 얼마나 많은 요소를 갖고 있는지 언급하지 않았으며이 정보를 추가 할 수 있습니까? – Warlock
"조기 최적화는 모든 악의 근원"- Donald Knuth – Warlock