Как вы тестируете производительность кода JavaScript? - PullRequest
296 голосов
/ 21 сентября 2008

Циклы ЦП, использование памяти, время выполнения и т. Д .?

Добавлено: Существует ли количественный способ тестирования производительности в JavaScript, помимо простого восприятия скорости выполнения кода?

Ответы [ 19 ]

6 голосов
/ 21 сентября 2008

Вы можете использовать это: http://getfirebug.com/js.html. Имеется профилировщик для JavaScript.

3 голосов
/ 10 июня 2014

Быстрый ответ

В jQuery (точнее, в Sizzle) мы используем this (мастер проверки и скорость открытия / index.html в вашем браузере), который, в свою очередь, использует benchmark.js . Это используется для проверки производительности библиотеки.

Длинный ответ

Если читатель не знает разницы между эталонным тестом, рабочей нагрузкой и профилировщиками, сначала прочитайте некоторые основы тестирования производительности в разделе «readme 1st» spec.org . Это для тестирования системы, но понимание этой основы также поможет JS-тестированию. Некоторые основные моменты:

Что такое эталонный тест?

Эталоном является «стандарт измерения или оценки» (словарь Вебстера II). Эталонный тест обычно представляет собой компьютерную программу, которая выполняет строго определенный набор операций - рабочую нагрузку - и возвращает некоторую форму результата - метрику - описывающую работу тестируемого компьютера. Компьютерные метрики обычно измеряют скорость: насколько быстро была выполнена рабочая нагрузка; или пропускная способность: сколько единиц рабочей нагрузки за единицу времени было выполнено. Запуск одного и того же эталонного теста на нескольких компьютерах позволяет проводить сравнение.

Стоит ли тестировать свое приложение?

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

Если не мое собственное приложение, то что?

Возможно, вы захотите рассмотреть возможность использования стандартизированных ориентиров в качестве ориентира. В идеале стандартизированный бенчмарк должен быть переносимым и, возможно, уже запущен на интересующих вас платформах. Однако, прежде чем рассматривать результаты, необходимо убедиться, что вы понимаете взаимосвязь между своими приложениями / вычислительными потребностями и тем, что эталоном является измерение. Схожие тесты с типами приложений, которые вы запускаете? Имеют ли рабочие нагрузки похожие характеристики? Основываясь на ваших ответах на эти вопросы, вы сможете увидеть, как эталонный тест может приблизиться к вашей реальности.

Примечание: в качестве ориентира может выступать стандартизированный эталон Тем не менее, когда вы делаете выбор поставщика или продукта, SPEC не утверждает, что какой-либо стандартизированный эталонный тест может заменить эталонный тест вашего собственного реального приложения.

Тестирование производительности JS

В идеале, лучшим тестом производительности будет использование собственного приложения с переключением рабочей нагрузки, что вам нужно для тестирования: разные библиотеки, машины и т. Д.

Если это невозможно (и обычно это не так). Первый важный шаг: определите свою рабочую нагрузку. Он должен отражать нагрузку на ваше приложение. В этом выступлении Вячеслав Егоров говорит о дерьмовых нагрузках, которых следует избегать.

Затем вы могли бы использовать такие инструменты, как benchmark.js, чтобы помочь вам собирать метрики, обычно скорость или пропускную способность. На Sizzle нам интересно сравнить, как исправления или изменения влияют на системную производительность библиотеки.

Если что-то действительно плохо работает, ваш следующий шаг - поиск узких мест.

Как мне найти узкие места? Профайлеры

Каков наилучший способ профилирования выполнения JavaScript?

3 голосов
/ 21 сентября 2008

Я считаю, что время выполнения - лучшая мера.

2 голосов
/ 04 сентября 2012

Вы можете использовать console.profile в firebug

1 голос
/ 20 мая 2009

Я обычно просто тестирую производительность javascript, как долго работает скрипт. jQuery Lover дал хорошую ссылку на статью для тестирования производительности JavaScript-кода , но в статье только показано, как проверить, как долго работает ваш код JavaScript. Я также рекомендовал бы прочитать статью под названием «5 советов по улучшению кода jQuery при работе с огромными наборами данных».

1 голос
/ 12 января 2016

Вот класс многократного использования для времени исполнения. Пример включен в код:

/*
     Help track time lapse - tells you the time difference between each "check()" and since the "start()"

 */
var TimeCapture = function () {
    var start = new Date().getTime();
    var last = start;
    var now = start;
    this.start = function () {
        start = new Date().getTime();
    };
    this.check = function (message) {
        now = (new Date().getTime());
        console.log(message, 'START:', now - start, 'LAST:', now - last);
        last = now;
    };
};

//Example:
var time = new TimeCapture();
//begin tracking time
time.start();
//...do stuff
time.check('say something here')//look at your console for output
//..do more stuff
time.check('say something else')//look at your console for output
//..do more stuff
time.check('say something else one more time')//look at your console for output
1 голос
/ 12 июня 2015

UX Profiler подходит к этой проблеме с точки зрения пользователя. Он группирует все события браузера, сетевую активность и т. Д., Вызванные некоторыми действиями пользователя (щелчок), и учитывает все аспекты, такие как задержка, время ожидания и т. Д.

0 голосов
/ 21 сентября 2008

Золотое правило - НЕ при любых обстоятельствах блокировать браузер пользователя. После этого я обычно смотрю на время выполнения, а затем на использование памяти (если вы не делаете что-то сумасшедшее, в этом случае это может быть более высокий приоритет).

0 голосов
/ 09 октября 2013

Это хороший способ сбора информации о производительности для конкретной операции.

start = new Date().getTime(); 
for (var n = 0; n < maxCount; n++) {
/* perform the operation to be measured *//
}
elapsed = new Date().getTime() - start;
assert(true,"Measured time: " + elapsed);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...