[javascript] JavaScript 코드 성능을 어떻게 테스트합니까?

CPU 사이클, 메모리 사용량, 실행 시간 등?

추가 : 코드 실행 속도에 대한 인식 외에도 JavaScript에서 성능을 테스트하는 양적 방법이 있습니까?



답변

프로파일 러는 확실히 숫자를 얻는 좋은 방법이지만, 내 경험상 인식 된 성능은 사용자 / 클라이언트에게 중요한 것입니다. 예를 들어, Ext 아코디언을 사용하여 일부 데이터를 보여주고 몇 개의 중첩 Ext 그리드를 보여주는 프로젝트가있었습니다. 모든 것이 실제로 매우 빠르게 렌더링되었고, 단일 작업에 오랜 시간이 걸리지 않았으며, 한 번에 많은 정보가 렌더링되어 사용자에게 느려졌습니다.

더 빠른 구성 요소로 전환하거나 일부 방법을 최적화하는 것이 아니라 데이터를 먼저 렌더링 한 다음 setTimeout을 사용하여 그리드를 렌더링하여이를 수정했습니다. 정보가 먼저 나타난 다음 격자가 잠시 후에 나타납니다. 전체적으로 처리 시간이 약간 더 걸렸지 만 사용자에게는 인식 된 성능이 향상되었습니다.


요즘은 크롬 프로파일 및 기타 도구는 사용이 보편적으로 이용 가능하고 쉽게되어 console.time(), console.profile()performance.now(). 또한 Chrome은 타임 라인보기를 제공하여 프레임 속도를 저하시키는 원인, 사용자가 대기중인 위치 등을 보여줍니다.

이러한 모든 도구에 대한 문서를 찾는 것은 정말 쉽습니다. SO 답변이 필요하지 않습니다. 7 년 후에도 여전히 원래의 대답에 대한 조언을 반복하고 사용자가 알지 못하는 곳에서 영원히 느린 코드를 실행할 수 있으며, 그들이하는 곳에서 매우 빠른 코드를 실행할 수 있으며 꽤 빠른 코드는 충분히 빠르지 않습니다. 또는 서버 API 요청에 220ms가 걸렸습니다. 아니면 다른 것. 요점은 프로파일 러를 꺼내서 할 일을 찾으면 찾을 수 있지만 사용자에게 필요한 작업이 아닐 수도 있습니다.


답변

나는 인식 된 성능이 정말로 중요하다는 것에 동의합니다. 그러나 때로는 어떤 방법을 사용하는 것이 더 빠른지 알고 싶습니다. 때로는 그 차이가 거대하고 알만한 가치가 있습니다.

당신은 자바 스크립트 타이머를 사용할 수 있습니다. 하지만 일반적으로 훨씬 더 일관성 (이제 파이어 폭스와 사파리에서) 기본 크롬을 사용하여 결과 devTool 방법 얻을 console.time()&를console.timeEnd()

사용 방법의 예 :

var iterations = 1000000;
console.time('Function #1');
for(var i = 0; i < iterations; i++ ){
    functionOne();
};
console.timeEnd('Function #1')

console.time('Function #2');
for(var i = 0; i < iterations; i++ ){
    functionTwo();
};
console.timeEnd('Function #2')

결과는 다음과 같습니다

업데이트 (2016 년 4 월 4 일) :

Chrome 카나리아는 최근에 각 라인을 실행하는 데 걸린 시간을 정확히 확인할 수있는 개발 도구 소스 탭을 라인 레벨 프로파일 링 에 추가했습니다 !
여기에 이미지 설명을 입력하십시오


답변

우리는 항상 간단한 날짜 객체로 모든 함수에 걸리는 시간을 측정 할 수 있습니다 .

var start = +new Date();  // log start timestamp
function1();
var end =  +new Date();  // log end timestamp
var diff = end - start;


답변

jsPerf를 시도 하십시오 . 코드 스 니펫을 벤치마킹하고 비교하기위한 온라인 자바 스크립트 성능 도구입니다. 나는 항상 그것을 사용합니다.


답변

현재 대부분의 브라우저는에서 고해상도 타이밍을 구현하고 performance.now()있습니다. new Date()시스템 클럭과 독립적으로 작동하기 때문에 성능 테스트 보다 우수합니다 .

용법

var start = performance.now();

// code being timed...

var duration = performance.now() - start;

참고 문헌


답변

JSLitmus 는 임시 JavaScript 벤치 마크 테스트를 작성하기위한 간단한 도구입니다.

function expression와 사이의 성능을 살펴 보겠습니다 function constructor.

<script src="JSLitmus.js"></script>
<script>

JSLitmus.test("new Function ... ", function() {
    return new Function("for(var i=0; i<100; i++) {}");
});

JSLitmus.test("function() ...", function() {
       return (function() { for(var i=0; i<100; i++) {}  });
});

</script>

위에서 한 것은 동일한 작업을 수행 function expression하고 function constructor수행하는 것입니다. 결과는 다음과 같습니다.

FireFox 성능 결과

FireFox 성능 결과

IE 성능 결과

IE 성능 결과


답변

일부 사람들은 특정 플러그인 및 / 또는 브라우저를 제안합니다. 나는 그들이 하나의 플랫폼 에만 실제로 유용 하기 때문이 아닙니다 . Firefox에서 테스트를 실행하면 IE7로 정확하게 변환되지 않습니다. 99.999999 %의 사이트가 둘 이상의 브라우저를 방문한다고 가정 하면 모든 인기있는 플랫폼에서 성능을 확인해야합니다.

내 제안은 이것을 JS에 보관하는 것입니다. 모든 JS 테스트 및 실행 시간을 기준으로 벤치마킹 페이지를 만듭니다. 결과를 AJAX 게시하여 다시 자동화되도록 할 수도 있습니다.

그런 다음 다른 플랫폼을 헹구고 반복하십시오.