JavaScript 코드를 어떻게 벤치 마크 할 수 있습니까? [닫은]
JavaScript 코드를 벤치마킹하는 데 도움이되는 패키지가 있습니까? 나는 Firebug 및 그러한 도구를 언급하는 것이 아닙니다.
구현 한 두 가지 JavaScript 함수를 비교해야합니다. 저는 Perl의 Benchmark ( Benchmark.pm ) 모듈에 매우 익숙하며 JavaScript에서 비슷한 것을 찾고 있습니다.
JavaScript 코드 벤치마킹에 대한 강조가 과도하게 지나갔습니까? 기능을 한 번만 실행하면 시간을 절약 할 수 있습니까?
각 함수를 여러 번 반복하십시오. 한 번의 반복만으로는 충분하지 않을 수 있지만 (함수가 얼마나 복잡한 지에 따라) 100 회 또는 1,000 회에 가까운 반복이 작업을 수행해야합니다.
Firebug에는 함수의 어떤 부분이 속도를 늦추는 지 확인하려는 경우 프로파일 러도 있습니다.
편집 : 미래의 독자들에게 JSPerf를 권장하는 아래 답변이 정답이어야합니다. 내 항목을 삭제할 수 있지만 OP에 의해 선택 되었기 때문에 할 수 없습니다. 벤치마킹에는 많은 반복을 실행하는 것보다 훨씬 더 많은 것이 있으며 JSPerf가이를 처리합니다.
jsperf.com 은 JS 성능 테스트를위한 사이트입니다. 거기에서 시작하십시오. 명령 줄 또는 스크립트에서 자체 테스트를 실행하기위한 프레임 워크가 필요한 경우 jsperf.com이 빌드되는 라이브러리 인 Benchmark.js 를 사용 합니다.
참고 : 자바 스크립트 코드를 테스트하는 사람은 누구나 "마이크로 벤치 마크"(실제 코드 패턴을 기반으로하는보다 복잡한 테스트가 아닌 특정 기능 또는 작업을 대상으로하는 소규모 테스트)의 함정에 대해 교육해야합니다. 이러한 테스트는 유용 할 수 있지만 최신 JS 런타임이 작동하는 방식으로 인해 부정확하기 쉽습니다. 성능 및 벤치마킹에 대한 Vyacheslav Egorov의 프레젠테이션 은 문제의 성격을 파악 하기 위해 시청할 가치가 있습니다.
편집 : 더 이상 관련성이 없거나 유용하지 않기 때문에 JSLitmus에 대한 참조가 제거되었습니다.
누군가가 유용하다고 생각할 수있는 빠른 타이머를 믹스에 추가하기 만하면됩니다.
var timer = function(name) {
var start = new Date();
return {
stop: function() {
var end = new Date();
var time = end.getTime() - start.getTime();
console.log('Timer:', name, 'finished in', time, 'ms');
}
}
};
이상적으로는 클래스에 배치되고 위의 예제 목적으로했던 것처럼 전역으로 사용되지 않습니다. 그것을 사용하는 것은 매우 간단합니다.
var t = timer('Some label');
// code to benchmark
t.stop(); // prints the time elapsed to the js console
간단한 방법입니다.
console.time('test');
console.timeEnd('test');
나는 @musicfreaks 대답 의이 간단한 구현을 사용하고 있습니다. 기능은 없지만 사용하기 정말 쉽습니다. 이것은 bench(function(){return 1/2;}, 10000, [], this)
1/2 10,000 번을 계산할 것입니다.
/**
* Figure out how long it takes for a method to execute.
*
* @param {Function} method to test
* @param {number} iterations number of executions.
* @param {Array} args to pass in.
* @param {T} context the context to call the method in.
* @return {number} the time it took, in milliseconds to execute.
*/
var bench = function (method, iterations, args, context) {
var time = 0;
var timer = function (action) {
var d = Date.now();
if (time < 1 || action === 'start') {
time = d;
return 0;
} else if (action === 'stop') {
var t = d - time;
time = 0;
return t;
} else {
return d - time;
}
};
var result = [];
var i = 0;
timer('start');
while (i < iterations) {
result.push(method.apply(context, args));
i++;
}
var execTime = timer('stop');
if ( typeof console === "object") {
console.log("Mean execution time was: ", execTime / iterations);
console.log("Sum execution time was: ", execTime);
console.log("Result of the method call was:", result[0]);
}
return execTime;
};
적절한 크로스 브라우저 벤치 마크를 작성하는 것은 정말 어렵습니다. 단순히 미리 정의 된 코드 반복 횟수를 타이밍하는 것은 전혀 방탄 이 아닙니다 .
@broofa 이미 제안한 것처럼, 체크 아웃 jsPerf을 . 뒤에서 Benchmark.js를 사용 합니다.
사용자 정의 벤치 마크 스크립트를 작성하는 경우 일부 브라우저는 정의 된 기능이 종료 된 후에 만 dom 조작을 적용한다는 점에 유의하십시오. 자세한 내용은 여기 http://www.quirksmode.org/blog/archives/2009/08/when_to_read_ou.html
간단한 것이 필요하면 다음과 같이 할 수 있습니다.
'use strict'
console.clear()
const powerOf = x => y => Math.pow(x, y)
const powerOfThree = powerOf(3)
function performanceCalc(fn, ...params) {
const start = +new Date()
const result = fn(...params)
const end = +new Date()
console.log(`Result: ${result}. Execution Time: ${end - start} ms`)
}
performanceCalc(powerOfThree, 2)
참고URL : https://stackoverflow.com/questions/1003855/how-can-i-benchmark-javascript-code
'program tip' 카테고리의 다른 글
테스트 실패와 관련된 전체 추적을 제공하기 위해 rspec-2를 얻는 방법은 무엇입니까? (0) | 2020.08.26 |
---|---|
'nuget'은 인식되지 않지만 다른 nuget 명령은 작동합니다. (0) | 2020.08.26 |
액세스로부터 자바 소스 코드 보호 (0) | 2020.08.26 |
유형이 매개 변수없는 생성자를 제공하는지 어떻게 확인합니까? (0) | 2020.08.25 |
Ember RunLoop이란 무엇이며 어떻게 작동합니까? (0) | 2020.08.25 |