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

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

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

Делает ли акцент на бенчмаркинг кода JavaScript за бортом? Могу ли я уйти со временем только одним запуском функций?

javascript,benchmarking,

83

Ответов: 8


25 ов принято

Всего раз несколько итераций каждой функции. Одной итерации, вероятно, будет недостаточно, но (в зависимости от того, насколько сложны ваши функции) где-то ближе к 100 или даже тысячам итераций должно выполнить эту работу.

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

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


99

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

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

Изменить: удалены ссылки на мою работу JSLitmus, поскольку это уже не актуально или полезно.


55 ов

Просто добавив в микс быстрый таймер, который может оказаться полезным:

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

19 ов

Я использовал эту простую реализацию ответа @musicfreaks. Нет никаких функций, но он очень прост в использовании. Это 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;  
};

уя 14

Просто простой способ.

console.time('test');
console.timeEnd('test');
JavaScript, бенчмаркинг,
Похожие вопросы