program tip

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

radiobox 2020. 8. 26. 07:44
반응형

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

반응형