문제

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

내가 구현한 2개의 서로 다른 JavaScript 함수를 비교해야 합니다.나는 Perl의 벤치마크(벤치마크.pm) 모듈과 저는 JavaScript에서 비슷한 것을 찾고 있습니다.

JavaScript 코드 벤치마킹에 대한 강조가 너무 지나쳤나요?함수를 한 번만 실행해도 괜찮을까요?

도움이 되었습니까?

해결책

각 함수의 여러 반복. 하나의 반복은 아마도 충분하지 않을 것이지만 (기능이 얼마나 복잡한 지에 따라) 100 또는 1,000 반복에 가까운 곳에는 작업을 수행해야합니다.

Firebug에는 다음에도 있습니다 프로파일 러 기능의 어떤 부분이 속도를 늦추고 있는지 확인하려면

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

다른 팁

jsperf.com JS 성능을 테스트하기위한 사이트입니다. 거기서 시작하십시오. 명령 줄이나 스크립트에서 자신의 테스트를 실행하기위한 프레임 워크가 필요한 경우 Benchmark.js, jsperf.com이 구축 된 라이브러리.

메모: JavaScript 코드를 테스트하는 사람은 누구나 "MicroBenchmarks"의 함정에 대해 스스로 교육해야합니다 (실제 코드 패턴을 기반으로보다 복잡한 테스트보다는 특정 기능 또는 작업을 대상으로하는 소규모 테스트). 이러한 테스트는 유용 할 수 있지만 현대식 JS 런타임의 작동 방식으로 인해 부정확성이 발생하기 쉽습니다. 성능 및 벤치마킹에 대한 Vyacheslav Egorov의 프레젠테이션 문제의 본질에 대한 느낌을 얻기 위해 시청할 가치가 있습니다.

편집하다: 내 jslitmus 작업에 대한 참조가 더 이상 관련이 있거나 유용하지 않기 때문에 내 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)

다음은 코드의 예입니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top