Как можно игнорировать библиотеки, такие как jQuery, при профилировании JavaScript? - PullRequest
15 голосов
/ 05 декабря 2011

Конечно, Firebug, Chrome Web Inspector, Opera Dragonfly и инструменты AjAX для IE от dynaTrace имеют возможности профилирования.Однако я не нашел инструмента, который позволял бы мне «игнорировать» библиотеку.

В качестве примера предположим, что у меня есть следующий чистый код JS / DOM:

function foo(node) {
    for (var i = 0; i < node.childNodes.length; i++) {
        node.childNodes[i].innerHTML = 'Test';
    }
}

ипохожий фрагмент кода, который использует jQuery:

function bar(jqNode) {
    jqNode.children().each(function() {
        $(this).html('Test');
    });
}

(примеры не совсем хороший код, пожалуйста, оставьте их, поскольку это не главное)

Если вы бросите оба черезВ JS-профилировщике вы обнаружите, что в первом примере есть только одна функция, в которой «собственное время» функции равно «общему» времени, потраченному на функцию - поскольку манипуляции с DOM считаются «собственным временем».

Однако в примере jQuery все это абстрагировано в jQuery, что означает, что «собственное время» минимально и все время затрачивается на jQuery.

Это делает его оченьТрудно найти узкие места в производительности, потому что функции с самым высоким «собственным временем» - это jQuery.fix и jQuery.init и тому подобное (что ничего не говорит мне о том, насколько хорошо написан (или нет) мой код), ифункции с наибольшим общим временем«как правило, слишком высоки в стеке вызовов, чтобы выяснить, где на самом деле проблема (если у вас есть одна функция, которая вызывает 10 других, а другая -« навсегда », вызывающая функция будет иметь большее« общее время », но это выиграло»t позволяет вам выяснить, какая из вызываемых функций занимает больше всего времени ').

Ответы [ 4 ]

4 голосов
/ 21 апреля 2012

Фильтрация библиотек - это не то, что вам нужно, и AFAIK, никакой профилировщик, делает это так, как вы этого хотите.Кроме того, если ваш код написан плохо из-за того, что он использует библиотечные вызовы, вы хотите увидеть, какие вызовы библиотеки он использует.

Используйте встроенный профилировщик Chrome в режиме «Дерево (сверху вниз)».(Выберите режим в нижней части столбцов «Сам» и «Всего».) В этом режиме вы можете увидеть общее время, которое каждая функция занимает вместе с общим временем, потраченным на каждую функцию, которую вызывает функция, и так далее, до конечных функций, которые не вызываютдругие функции.Таким образом, в вашей функции bar() вы увидите общее время, проведенное в баре, и ниже этого, общее время, потраченное bar на вызов each и так далее.(Теперь с jQuery это может немного запутаться, но это не совсем так.)

Так что, если у вас есть одна функция, которая вызывает 10 других, а другая - «навсегда», вызывающая функция будет иметь большую'total time', и вы выясните, какая из вызванных функций занимает больше всего времени, щелкнув по треугольнику и развернув функцию 'forever' и посмотрев общее время каждой из функций, которые она вызывает.Если 9 занимает немного времени, а 1 - навсегда, то это виновник, и вы продолжаете бурение, пока не найдете проблему.

РЕДАКТИРОВАТЬ: еще несколько советов по использованию профилировщика Chrome

  • Используйте представление «Тяжелый (снизу вверх)», чтобы найти листовые функции, которые отнимают много времени.Треугольники показывают, кто их вызывает.
  • опция-нажмите на треугольник, чтобы открыть все дерево.Сохраняет много нажатий по глубоко вложенным цепочкам вызовов.
  • "(программа)" относится к той части времени, когда был запущен профилировщик, в течение которого не выполнялся JavaScript.Такие вещи, как рендеринг HTML.

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

1 голос
/ 05 декабря 2011

Вы можете попробовать включить или выключить профилирование в коде, используя console.profile и console.profileEnd.Ссылки на документацию Firebug, но по крайней мере Webkit также поддерживает это.Не уверен насчет IE.

1 голос
/ 13 декабря 2011

Используя dynaTrace AJAX Edition, вы можете исключить библиотеку, указанную по ее URL в диалоге настроек.На вкладке Агент вы можете указать список файлов, которые не должны отслеживаться.Так что если вы перечислите там свой jquery.js, вы не должны видеть никаких связанных с jquery узлов в ваших PurePaths ...

1 голос
/ 05 декабря 2011

Вы пробовали плагин для профилировщика Джона Ресига?

http://ejohn.org/blog/deep-profiling-jquery-apps/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...