Как я могу сравнить JavaScript-код?
Есть ли пакет, который помогает мне тестировать JavaScript-код? Я не имею в виду Firebug и такие инструменты.
Мне нужно сравнить две разные функции JavaScript, которые я реализовал. Я очень хорошо знаком с модулем Perl Benchmark (Benchmark.pm), и я ищу что-то подобное в JavaScript.
Делает ли акцент на бенчмаркинг кода JavaScript за бортом? Могу ли я уйти со временем только одним запуском функций?
Ответы
Ответ 1
Просто несколько итераций каждой функции. Одной итерации, вероятно, будет недостаточно, но (в зависимости от того, насколько сложны ваши функции) где-то ближе к 100 или даже тысячам итераций должно выполняться задание.
Firebug также имеет профайлер, если вы хотите увидеть, какие части вашей функции замедляют его./p >
Изменить: К будущим читателям, правильный ответ, рекомендующий JSPerf, должен быть правильным ответом. Я бы удалил мой, но я не могу, потому что он был выбран OP. Существует гораздо больше для бенчмаркинга, чем просто запуск многих итераций, и JSPerf позаботится об этом для вас.
Ответ 2
jsperf.com - это сайт для тестирования производительности JS. Начните там. Если вам нужна фреймворк для запуска собственных тестов из командной строки или скриптов, используйте Benchmark.js - библиотеку, на которой построен jsperf.com.
Примечание.. Любой тестирующий код Javascript должен воспитывать себя в подводных камнях "микрообъектов" (небольшие тесты, предназначенные для конкретной функции или операции, а не более сложные тесты, основанные на реальных образцах кода), Такие тесты могут быть полезны, но подвержены неточности из-за того, как работают современные JS-среды. Вступление Вячеслава Егорова о производительности и сравнительном тестировании стоит посмотреть, чтобы понять характер проблемы (проблем).
Изменить: Удалены ссылки на мою работу JSLitmus, поскольку она больше не актуальна или полезна.
Ответ 3
Просто добавьте в микс быстрый таймер, который может оказаться полезным:
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
Ответ 4
Я использую эту простую реализацию ответа @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;
};
Ответ 5
Просто простой способ.
console.time('test');
console.timeEnd('test');
Ответ 6
На самом деле трудно писать приличные кросс-браузерные тесты. Простое задание определенного количества итераций вашего кода не является пуленепробиваемым вообще.
Как уже было предложено @broofa, просмотрите jsPerf. Он использует Benchmark.js за кулисами.
Ответ 7
при написании пользовательского теста script обязательно отметьте, что некоторые браузеры применяют манипуляции dom только после того, как функция, в которой они определены, завершена. Подробнее здесь
http://www.quirksmode.org/blog/archives/2009/08/when_to_read_ou.html
Ответ 8
Если вам нужно что-то простое, вы можете сделать следующее:
'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)
Вот пример кода