89

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

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

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

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

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

    от
  • Error: User Rate Limit Exceeded

    от
  • 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 Exceedednot bulletproof at allError: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceededprocess.hrtime()Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceededjsben.chError: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceededpastebin.com/gCs9CB5F

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Я знаю, что это не пуленепробиваемый и все, но все равно связано: иногда вы просто хотите знатьhow to measure time taken by a function to execute.

    от Skippy le Grand Gourou
  • Хороший инструмент для тестирования JavaScript вы можете найти здесь:jsben.ch

    от EscapeNetscape
  • Кажется, что дурак:stackoverflow.com/search?q=javascript+profiler

    от steamer25
  • Возможный дубликатHow do you performance test JavaScript code?

    от John Slegers
8 ответов
  • 21

    Просто простой способ. console.time('test'); console.timeEnd('test');

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

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

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

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

  • 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;  
    };
    

  • 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
    

  • 8

    Трудно написать достойные кроссбраузерные тесты. Простое определение в

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

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

  • 31

    Just time several iterations of each function. One iteration probably

    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 позаботится об этом за вас.

  • 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, поскольку она больше не актуальна и не полезна.