Question

Existe-t-il un package qui me permet de comparer le code JavaScript? Je ne parle pas de Firebug et de tels outils.

Je dois comparer 2 fonctions JavaScript différentes que j'ai implémentées. Je connais très bien le module Benchmark de Perl ( Benchmark.pm ) et je recherche quelque chose de similaire dans JavaScript.

L'accent mis sur l'analyse comparative du code JavaScript est-il allé trop loin? Puis-je me permettre de chronométrer une seule série de fonctions?

Était-ce utile?

La solution

Juste le temps de plusieurs itérations de chaque fonction. Une itération ne sera probablement pas suffisante, mais (selon la complexité de vos fonctions), un travail proche de 100 voire 1 000 itérations devrait suffire.

Firebug a également un profileur si vous souhaitez voir quelles parties de votre fonction ralentissent. il vers le bas.

Modifier: Pour les futurs lecteurs, la réponse ci-dessous recommandant JSPerf devrait être la réponse correcte. Je supprimerais le mien, mais je ne peux pas car il a été sélectionné par l'OP. L'analyse comparative ne se résume pas à l'exécution de nombreuses itérations. JSPerf s'en charge pour vous.

Autres conseils

jsperf.com est le site de référence pour tester les performances de JS. Commencez par là. Si vous avez besoin d’une infrastructure pour exécuter vos propres tests à partir de la ligne de commande ou de scripts, utilisez Benchmark.js , la bibliothèque sur laquelle jsperf .com est construit.

Remarque: Tous ceux qui testent du code Javascript doivent se renseigner sur les pièges de "microbenchmarks". (petits tests qui ciblent une fonctionnalité ou une opération spécifique, plutôt que des tests plus complexes basés sur des modèles de code du monde réel). De tels tests peuvent être utiles mais sont sujets à des imprécisions en raison du fonctionnement des environnements d'exécution JS modernes. La présentation de Vyacheslav Egorov sur les performances et l'analyse comparative vaut la peine d'être surveillée pour se faire une idée de la nature. du (des) problème (s).

Modifier: Les références à mon travail JSLitmus ont été supprimées car elles ne sont plus pertinentes ni utiles.

Ajoutez simplement une minuterie rapide au mixage, que quelqu'un pourra trouver utile:

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');
        }
    }
};

Idéalement, il serait placé dans une classe et non utilisé en tant que global, comme je l’ai fait pour les exemples ci-dessus. L’utiliser serait assez simple:

var t = timer('Some label');
// code to benchmark
t.stop(); // prints the time elapsed to the js console

Simplement simple.

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

J'utilise cette implémentation simple de @musicfreaks answer. Il n'y a pas de fonctionnalités, mais il est vraiment facile à utiliser. Ce banc (function () {return 1/2;}, 10000, [], this) calculera 1/2 à 10 000 fois.

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

Il est très difficile d’écrire des tests de performances corrects entre navigateurs. Le simple chronométrage d’un nombre prédéfini d’itérations de votre code est pas du tout blindé .

Comme @broofa l'a déjà suggéré, consultez jsPerf . Il utilise les Benchmark.js en coulisse.

Si vous écrivez un script d'évaluation personnalisé, veuillez noter que certains navigateurs n'appliquent des manipulations de dom qu'après la fin de la fonction dans laquelle ils sont définis. Plus de détails ici http://www.quirksmode.org/blog/archives/2009/08 /when_to_read_ou.html

Si vous avez besoin de quelque chose de simple, procédez comme suit:

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

Voici un exemple de code

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top