JavaScript 코드를 어떻게 벤치 마크 할 수 있습니까? [닫은]


104

JavaScript 코드를 벤치마킹하는 데 도움이되는 패키지가 있습니까? 나는 Firebug 및 그러한 도구를 언급하는 것이 아닙니다.

구현 한 두 가지 JavaScript 함수를 비교해야합니다. 저는 Perl의 Benchmark ( Benchmark.pm ) 모듈에 매우 익숙하며 JavaScript에서 비슷한 것을 찾고 있습니다.

JavaScript 코드 벤치마킹에 대한 강조가 과도하게 지나갔습니까? 기능을 한 번만 실행하면 시간을 절약 할 수 있습니까?




나는 그것이 방탄이 아니며 어쨌든 관련이 있다는 것을 알고 있습니다. 때로는 함수가 실행하는 데 걸리는 시간을 측정하는 방법을 알고 싶을 때가 있습니다 .
Skippy le Grand Gourou

1
좋은 JavaScript 벤치 마크 도구는 여기에서 찾을 수 있습니다 : jsben.ch
EscapeNetscape

답변:


36

각 함수를 여러 번 반복하십시오. 한 번의 반복만으로는 충분하지 않을 수 있지만 (함수가 얼마나 복잡한 지에 따라) 100 회 또는 1,000 회에 가까운 반복이 작업을 수행해야합니다.

Firebug에는 함수의 어떤 부분이 속도를 늦추는 지 확인하려는 경우 프로파일 러도 있습니다.

편집 : 미래의 독자들에게 JSPerf를 권장하는 아래 답변이 정답이어야합니다. 내 항목을 삭제할 수 있지만 OP에 의해 선택 되었기 때문에 할 수 없습니다. 벤치마킹에는 많은 반복을 실행하는 것보다 훨씬 더 많은 것이 있으며 JSPerf가이를 처리합니다.


12
단순히 미리 정의 된 코드 반복 횟수를 타이밍하는 것은 전혀 방탄아닙니다 . 또한 Firebug를 열면 Firefox의 JIT (Just-In-Time) 컴파일러가 비활성화됩니다. 즉, 테스트가 인터프리터에서 실행됩니다. 즉, 다른 경우보다 훨씬 느립니다. Firebug의 프로파일 러를 사용하면 예상 한 결과를 얻을 수 없습니다.
Mathias Bynens

1
@Mathias : 글쎄요, 공평하게 말하면이 답변은 정말 오래되었습니다.
Sasha Chedygov

2
물론입니다. 나는 그 주제에 대해 더 많은 연구가 이루어 졌기 때문에 향후 참조를 위해 언급 할 것이라고 생각했습니다.
Mathias Bynens

4
또는 jsperf가 다운되었으므로 jsben.ch를 사용 하십시오
EscapeNetscape

118

jsperf.com 은 JS 성능 테스트를위한 사이트입니다. 거기에서 시작하십시오. 명령 줄 또는 스크립트에서 자체 테스트를 실행하기위한 프레임 워크가 필요한 경우 jsperf.com이 빌드되는 라이브러리 인 Benchmark.js 를 사용 합니다.

참고 : 자바 스크립트 코드를 테스트하는 사람은 누구나 "마이크로 벤치 마크"(실제 코드 패턴을 기반으로하는보다 복잡한 테스트가 아닌 특정 기능 또는 작업을 대상으로하는 소규모 테스트)의 함정에 대해 교육해야합니다. 이러한 테스트는 유용 할 수 있지만 최신 JS 런타임이 작동하는 방식으로 인해 부정확하기 쉽습니다. 성능 및 벤치마킹에 대한 Vyacheslav Egorov의 프레젠테이션 은 문제의 성격을 파악 하기 위해 시청할 가치가 있습니다.

편집 : 더 이상 관련성이 없거나 유용하지 않기 때문에 JSLitmus에 대한 참조가 제거되었습니다.


3
업데이트 : jsperf.com을 사용하십시오-훨씬 좋아졌고 이런 종류의 일에 정말 잘 작동합니다. jslitmus는 여전히 작동하지만 꽤 오랫동안 활발하게 개발되지 않았습니다.
broofa 2011 년

이것은 우수한 대답입니다. +1
Justin Force

1
jsperf를 사용하고 싶었지만 N 루프에 대한 실제 호출 시간을 지정하는 대신 일정 기간 동안 코드를 실행할 수있는 횟수를 계산하는 것 같습니다. 나는 그들이 선택할 수있는 옵션이 있었으면 좋겠다.
Jeach

1
@Jeach-jsperf는 "초당 작업"을 제공합니다. 해당 값에 코드를 실행할 시간 (초)을 곱하면됩니다.
broofa

4
업데이트 : jsperf가 더 이상 온라인 상태가 아니며 다시 온라인 상태가 될 때 아무런 말도 없습니다. 자세한 내용은 이 github 스레드 를 참조하십시오.
James Gould

73

누군가가 유용하다고 생각할 수있는 빠른 타이머를 믹스에 추가하기 만하면됩니다.

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

6
여기에서 클로저를 잘 사용하십시오.
Dandy

12
보다 정확한 결과를 얻으려면 developer.mozilla.org/en-US/docs/Web/API/Performance/nowperformance.now() 대신 사용하는 것이 좋습니다Date()
thormeier

내가 필요한 것만-a timeIt ()
Gishu

1
TypeScript 버전 : pastebin.com/gCs9CB5F
Alexander Taylor

1
node.js의 경우 process.hrtime () 을 사용하여 나노초 해상도를 얻을 수 있습니다 .
Xeoncross

56

간단한 방법입니다.

console.time('test');
console.timeEnd('test');

3
이것은 받아 들여진 대답이어야합니다. 타사 서비스를 사용하는 것은 때때로 편리하지 않으며 단순한 내장 기능을 사용하는 것이 좋습니다.
brainbag

1
@brainbag-문제는 벤치마킹에 관한 것이 었는데, 이는 단순히 코드가 실행되는 시간을 측정하는 것 이상을 포함합니다. 또한 콘솔 타이머는 문제의 코드가 1 밀리 초 (해상도 한계) 이상 걸리는 경우에만 유용합니다.
broofa

타이머 값에 액세스해야하는 테스트 스위트에서 벤치 마크를 실행할 수도 있습니다.
JamesDev

20

나는 @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;  
};



1

간단한 것이 필요하면 다음과 같이 할 수 있습니다.

'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)

다음은 코드의 예입니다.


제 경우에는 Simple이 확실히 최선의 선택이었습니다. API에 대한 응답 시간을 벤치마킹하기 위해 몇 가지 테스트를 작성했습니다 (매우 정확한 시간이 필요하지 않음).
kashiraja
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.