Вопрос по javascript – Как я могу сравнить JavaScript код? [закрыто]

89

Есть ли пакет, который помогает мне тестировать код JavaScript? Я не имею в виду Firebug и подобные инструменты.

Мне нужно сравнить две разные функции JavaScript, которые я реализовал. Я очень хорошо знаком с эталоном Perl (Benchmark.pm) и я ищу что-то похожее в JavaScript.

Упущен ли упор на сравнительный анализ кода JavaScript? Могу ли я сойти с синхронизации только один запуск функций?

Хороший инструмент для тестирования JavaScript вы можете найти здесь:jsben.ch EscapeNetscape
Кажется, что дурак:stackoverflow.com/search?q=javascript+profiler steamer25
Я знаю, что это не пуленепробиваемый и все, но все равно связано: иногда вы просто хотите знатьhow to measure time taken by a function to execute. Skippy le Grand Gourou
Возможный дубликатHow do you performance test JavaScript code? John Slegers

Ваш Ответ

8   ответов
21

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

ремени заданного количества итераций вашего кодане пуленепробиваемый вообще.

Как уже сказал @broofa, проверьтеJSPerf, Оно используетBenchmark.js за кулисами.

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)

Вот пример кода

Error: User Rate Limit Exceeded
19

ких функций, но это действительно удобно. этоbench(function(){return 1/2;}, 10000, [], this) будет рассчитывать 1/2 10000 раз.

/**
 * 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;  
};
2

обязательно обратите внимание, что некоторые браузеры применяют манипуляции с dom только после завершения функции, в которой они определены. Подробнее здесь http://www.quirksmode.org/blog/archives/2009/08/when_to_read_ou.html

108

jsperf.com это сайт для тестирования производительности JS. Начни там. Если вам нужна среда для запуска собственных тестов из командной строки или использования скриптовBenchmark.jsбиблиотека, на которой построен jsperf.com.

Note: Любой, кто тестирует код Javascript, должен узнать о подводных камнях «микробенчмарков». (небольшие тесты, предназначенные для конкретной функции или операции, а не более сложные тесты, основанные на реальных шаблонах кода). Такие тесты могут быть полезны, но подвержены неточностям из-за того, как работают современные среды выполнения JS.Презентация Вячеслава Егорова по производительности и бенчмаркингу стоит посмотреть, чтобы понять природу проблемы.

Edit: Удалены ссылки на мою работу JSLitmus, поскольку она больше не актуальна и не полезна.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededthis github threadError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
59

который может оказаться полезным:

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
Error: User Rate Limit Exceededprocess.hrtime()Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededperformance.now()Error: User Rate Limit ExceededDate() developer.mozilla.org/en-US/docs/Web/API/Performance/now
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceededpastebin.com/gCs9CB5F
31

won't be enough, but (depending on how complex your functions are) somewhere closer to 100 or even 1,000 iterations should do the job.

Firebug also has a профайлер если вы хотите увидеть, какие части вашей функции замедляют ее.

Edit: Для будущих читателей следующий ответ с рекомендацией JSPerf должен быть правильным ответом. Я бы удалил свой, но не могу, потому что он был выбран OP. Сравнительный анализ намного шире, чем просто выполнение множества итераций, и JSPerf позаботится об этом за вас.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceedednot bulletproof at allError: User Rate Limit Exceeded
Error: User Rate Limit Exceededjsben.chError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы