2012-01-16 2 views
5

저는 수학 연산을 집중적으로 사용하는 자바 스크립트 응용 프로그램에서 일하고 있습니다. 마우스 당 수십 개의 호출이 움직입니다. Javascript에서 수학 객체의 속도

var pi = Math.PI 
var distance = (x * x) + (y * y)/R * R 
var pixels = ~~(x/y) 

는 Math 객체를 사용하기위한 상당한 성능 저하가 있나요 ... 내가 출발점으로 다른 사람의 사람들 코드 작업 있었고, 나는 종종 같은 기본 자바 스크립트 수학에 대한 작업 방법을 찾을 ? 그렇다면 몇 가지 일반적인 해결 방법은 무엇입니까? 당신은 자바 스크립트를 많이 물건을 계산하고 어떤 이유로 경우

+1

아마도'Math' 메소드는 자바 스크립트가 구현 된 언어 (예 : 일반적인 브라우저에서는 C 또는 C++)로 구현되므로 자바 스크립트로 작성할 수있는 것보다 훨씬 빠릅니다. –

+5

** ** ** 성능의 차이점은 무엇입니까? 모든 대상 브라우저에서 사용할 수 있습니까? –

+2

글쎄'수학 '은 "거리"방법을 가지고 있지 않으며, 그 정수 변환은 더 빨라질 수도 있지만'Math.floor()'또는'Math.round()'와 의미 상으로 다릅니다. [jsperf] (jsperf.com)를 사용하여 이런 종류의 것을 테스트 할 수 있습니다. – Pointy

답변

15

, 당신은 * (그 일을 기억하고 데이비드 Mandelin의 당신의 엔진을 알고 읽어야합니다 : 자바 스크립트 빠른 프레젠테이션을 만드는 방법 - PDF, 그는 더이 설명 세부 정보 *) :

  1. 인라인 할 수있는 모든 것.

  2. 함수 호출

  3. 개체 액세스가

  4. 다형성 당신에게 성능 비용이 수 비용이 매우 비싸, 당신의 변수와 인수는 항상 하나 개의 데이터 유형을 유지해야한다.

Math 객체는 특히 느린되지 않습니다,하지만 당신은 어쨌든 distance() 기능을 찾을 수 없습니다, 그리고 Math.method() 호출을 통해 폐쇄에서 메서드를 액세스하는 것은 비효율적이다.

그래서 sqrt은 물론, 더 이상 x*x, 당신을 위해 더 좋을 수도 사용자 정의 random 기능입니다, 파이는 min, 루프에 캐시되어야하며 max 아마뿐만 아니라 삼각 함수와 로그 함수 속도에 대해 어떤 생각을 피해야한다 .


P.S : 당신은 ((x >= 0 ? x : -x) + 0.5) >> 0 같은 일을 할 수 Math.ceil(Math.abs())을 대체하는 것이 아니라 기억 - 내가 "집중"말할 때 - 난 그런 재정 번호, 데이터 처리, 물리학, 그래픽과 것들에 대해 이야기하고있다. 정상적인 JavaScript 사이트 또는 RIA의 경우 - 일을해서는 안됩니다. 제가 여기 제안하고 있습니다. 또한, 대부분의 속도 해킹은 그들 side effects

+0

포인트 4에 대해서 ... 나는 정말로 이해하지 못합니다. 객체가있는 JS에서 오리 입력을 피할 수 없으므로 객체로 다형성을 피할 수 없습니다. 조회는 조회이므로 포인트 3과 동일합니다. –

+0

팁을 주셔서 감사 드리며이를 통해 미세 최적화보다 아키텍처에서 더 많이 얻은 것으로 보입니다. 내 코드는 그래픽과 관련되어 있으므로 약간의 성능을 압축해야합니다. – Duopixel

0

나는 함수 호출에 동의하지 않는다. if 문과 긴 특수 함수 내부의 명령문은 많은 작은 일반화 된 기능을 가진 잘 체계화 된 코드보다 느립니다.

관련 문제