CPU 사이클, 메모리 사용량, 실행 시간 등?
추가 : 코드 실행 속도에 대한 인식 외에도 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')

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

우리는 항상 간단한 날짜 객체로 모든 함수에 걸리는 시간을 측정 할 수 있습니다 .
var start = +new Date(); // log start timestamp
function1();
var end = +new Date(); // log end timestamp
var diff = end - start;
performance.now()
현재 대부분의 브라우저는에서 고해상도 타이밍을 구현하고 performance.now()있습니다. new Date()시스템 클럭과 독립적으로 작동하기 때문에 성능 테스트 보다 우수합니다 .
용법
var start = performance.now();
// code being timed...
var duration = performance.now() - start;
참고 문헌
performance.now().
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 성능 결과

IE 성능 결과

일부 사람들은 특정 플러그인 및 / 또는 브라우저를 제안합니다. 나는 그들이 하나의 플랫폼 에만 실제로 유용 하기 때문이 아닙니다 . Firefox에서 테스트를 실행하면 IE7로 정확하게 변환되지 않습니다. 99.999999 %의 사이트가 둘 이상의 브라우저를 방문한다고 가정 하면 모든 인기있는 플랫폼에서 성능을 확인해야합니다.
내 제안은 이것을 JS에 보관하는 것입니다. 모든 JS 테스트 및 실행 시간을 기준으로 벤치마킹 페이지를 만듭니다. 결과를 AJAX 게시하여 다시 자동화되도록 할 수도 있습니다.
그런 다음 다른 플랫폼을 헹구고 반복하십시오.
브라우저에서 작은 테스트 사례를 빠르게 실행하고 결과를 즉시 얻을 수있는 작은 도구가 있습니다.
코드를 사용하여 테스트 한 브라우저에서 어떤 기술이 더 나은지 알 수 있습니다.
JavaScript 성능 (시간) 테스트는 충분하다고 생각합니다. JavaScript 성능 테스트 에 대한 매우 유용한 기사를 여기 에서 찾았 습니다 .
당신은이를 사용할 수 있습니다 http://getfirebug.com/js.html를 . JavaScript 용 프로파일 러가 있습니다.
빠른 답변
(더 구체적으로 지글 지글)에 jQuery를, 우리는 사용 이 (체크 아웃 마스터와 개방 속도 브라우저에 / index.html을) 차례로 사용의 benchmark.js을 . 라이브러리 성능 테스트에 사용됩니다.
긴 대답
독자가 벤치 마크, 워크로드 및 프로파일 러의 차이점을 모른다면 먼저 spec.org 의 "readme 1st"섹션 에서 성능 테스트 기초를 읽으십시오 . 이는 시스템 테스트를위한 것이지만이 기초를 이해하면 JS 성능 테스트에도 도움이됩니다. 일부 주요 특징 :
벤치 마크 란 무엇입니까?
벤치 마크는 "측정 또는 평가 표준"(Webster 's II Dictionary)입니다. 컴퓨터 벤치 마크는 일반적으로 엄격하게 정의 된 작업 집합 (워크로드)을 수행하고 테스트 된 컴퓨터의 성능을 나타내는 메트릭 (결과)을 반환하는 컴퓨터 프로그램입니다. 컴퓨터 벤치 마크 지표는 일반적으로 속도를 측정합니다. 또는 처리량 : 단위 시간당 완료된 작업 단위 수. 여러 컴퓨터에서 동일한 컴퓨터 벤치 마크를 실행하면 비교할 수 있습니다.
내 응용 프로그램을 벤치마킹해야합니까?
이상적으로 시스템에 대한 최상의 비교 테스트는 자체 작업 부하가있는 자체 응용 프로그램입니다. 불행히도, 자체 워크로드가있는 자체 응용 프로그램을 사용하여 다른 시스템에 대해 신뢰할 수 있고 반복 가능하며 비교 가능한 광범위한 측정 기준을 얻는 것은 종종 비현실적입니다. 문제에는 좋은 테스트 사례 생성, 기밀 유지 문제, 비슷한 조건, 시간, 비용 또는 기타 제약 조건 확보에 어려움이있을 수 있습니다.
내 자신의 응용 프로그램이 아닌 경우 어떻게해야합니까?
표준화 된 벤치 마크를 참조 지점으로 사용하는 것이 좋습니다. 이상적으로 표준화 된 벤치 마크는 이식 가능하며 이미 관심있는 플랫폼에서 이미 실행되었을 수 있습니다. 그러나 결과를 고려하기 전에 응용 프로그램 / 컴퓨팅 요구 사항과 벤치 마크가 측정됩니다. 벤치 마크는 실행하는 응용 프로그램 종류와 비슷합니까? 작업 부하의 특성이 비슷합니까? 이러한 질문에 대한 답변을 바탕으로 벤치 마크가 현실과 어떻게 비슷한 지 알 수 있습니다.
참고 : 표준화 된 벤치 마크는 참조 지점으로 사용할 수 있습니다. 그럼에도 불구하고 공급 업체 또는 제품 선택을 수행 할 때 SPEC은 표준화 된 벤치 마크가 실제 응용 프로그램 벤치마킹을 대체 할 수 있다고 주장하지 않습니다.
성능 테스트 JS
가장 좋은 성능 테스트는 다른 라이브러리, 머신 등 테스트해야 할 작업을 전환하는 자체 워크로드와 함께 자체 애플리케이션을 사용하는 것입니다.
이것이 가능하지 않은 경우 (보통 그렇지 않은 경우) 첫 번째 중요한 단계 : 작업 부하를 정의하십시오. 애플리케이션의 워크로드를 반영해야합니다. 에서 이 이야기 , 뱌체슬라프 에고 로프는 피해야한다 엿 같은 워크로드에 대해 이야기합니다.
그런 다음 벤치 마크 .js와 같은 도구를 사용하여 메트릭 (일반적으로 속도 또는 처리량)을 수집 할 수 있습니다. Sizzle에서는 수정 또는 변경이 라이브러리의 시스템 성능에 어떤 영향을 미치는지 비교하는 데 관심이 있습니다.
무언가가 실제로 좋지 않은 경우 다음 단계는 병목 현상을 찾는 것입니다.
병목 현상을 어떻게 찾습니까? 프로파일 러
firebug에서 console.profile 을 사용할 수 있습니다
나는 보통 자바 스크립트 성능, 스크립트 실행 시간을 테스트합니다. jQuery Lover는 자바 스크립트 코드 성능 을 테스트하기위한 훌륭한 기사 링크를 제공 했지만이 기사에서는 자바 스크립트 코드 실행 시간을 테스트하는 방법 만 보여줍니다. 또한 " 거대한 데이터 세트로 작업하는 동안 jQuery 코드 를 개선하는 5 가지 팁"이라는 기사를 읽는 것이 좋습니다 .
다음은 시간 성능에 재사용 가능한 클래스입니다. 코드에 예제가 포함되어 있습니다.
/*
Help track time lapse - tells you the time difference between each "check()" and since the "start()"
*/
var TimeCapture = function () {
var start = new Date().getTime();
var last = start;
var now = start;
this.start = function () {
start = new Date().getTime();
};
this.check = function (message) {
now = (new Date().getTime());
console.log(message, 'START:', now - start, 'LAST:', now - last);
last = now;
};
};
//Example:
var time = new TimeCapture();
//begin tracking time
time.start();
//...do stuff
time.check('say something here')//look at your console for output
//..do more stuff
time.check('say something else')//look at your console for output
//..do more stuff
time.check('say something else one more time')//look at your console for output
성능 테스트는 최근에 유행어가되었지만 성능 테스트가 QA에서 중요한 프로세스가 아니거나 제품이 출시 된 후에도 중요하지 않다는 것은 아닙니다. 그리고 응용 프로그램을 개발하는 동안 많은 다른 도구를 사용하지만 크롬 프로파일 러 와 같이 위에서 언급 한 도구 중 일부는 일반적으로 SaaS 또는 오픈 소스를보고 무언가가 배가났다는 경고를 얻을 때까지 잊어 버릴 수 있습니다. .
몇 가지 기본 알림을 설정하기 위해 농구대를 뛰어 넘지 않고도 성능을 주시하는 데 도움이되는 멋진 도구가 많이 있습니다. 다음은 스스로 확인할 가치가 있다고 생각되는 몇 가지입니다.
보다 선명한 그림을 그려 보려면 반응 응용 프로그램에 대한 모니터링을 설정하는 방법에 대한 약간의 자습서가 있습니다.
이는 특정 작업에 대한 성능 정보를 수집하는 좋은 방법입니다.
start = new Date().getTime();
for (var n = 0; n < maxCount; n++) {
/* perform the operation to be measured *//
}
elapsed = new Date().getTime() - start;
assert(true,"Measured time: " + elapsed);