Подтвердить что ты не робот

Понимание профайлера Firebug

Я пытаюсь использовать профилировщик Firebug, чтобы лучше понять источник некоторых проблем производительности JavaScript, которые мы видим, но я немного смущен выходом.

Когда я просматриваю некоторый код, отчеты профилировщика Профиль (464.323 мс, 26 412 вызовов). Я подозреваю, что 464.323 мс - это сумма времени выполнения для этих 26 412 вызовов.

Однако, когда я перехожу к подробным результатам, я вижу индивидуальные результаты со средним временем выполнения, превышающим 464.323 мс, например. результат с самым высоким средним временем сообщает следующие данные:

Calls: **1**
Percent: **0%**
Own Time: **0.006 ms**
Time: **783.506 ms**
Avg: **783.506 ms**
Min: **783.506 ms**
Max: **783.506 ms**

Другие отчеты о результатах:

Calls: **4**
Percent: **0.01%**
Own Time: **0.032 ms**
Time: **785.279 ms**
Avg: **196.32 ms**
Min: **0.012 ms**
Max: **783.741 ms**

Между этими двумя результатами сумма результатов "Время" намного больше, чем 464.323.

Итак, что означают эти разные цифры? С какими я должен доверять?

4b9b3361

Ответ 1

В каждом столбце есть описание того, что это означает, если вы наведите указатель мыши на него в Firebug. Я предполагаю, что вы можете прочитать, как каждый столбец работает самостоятельно. Тем не менее, вы определенно сталкиваетесь с каким-то странным поведением, которое необходимо объяснить.

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

Тем не менее, время одиночное не должно превышать общее время профайлера, зарегистрированного для вызовов JavaScript. Эта проблема определенно является ошибкой, и я понимаю, почему у вас есть проблемы с доверием Firebug, когда он дает вам такой парадоксальный результат. Я считаю, что я обнаружил причину этой ошибки: AJAX.

Похоже, что вызовы AJAX вызывают столбцы, которые подсчитывают вложенные вызовы функций для сообщения неправильной информации. Они заканчивают подсчет времени выполнения JavaScript и запроса на сервер.

Вы можете воспроизвести эту ошибку профайлера, выполнив следующие действия:

  • Перейдите на любой сайт, на котором используется AJAX. (Я использовал http://juicystudio.com/experiments/ajax/index.php)
  • Отключить консоль / Script.
  • Включите профилировщик.
  • Сделайте вызов AJAX. (Несколько из них могут осветить проблему больше.)
  • Остановите профайлер, просмотрите вывод.

В этом примере, в отношении времени и собственного времени, собственное время каждой функции суммируется с общим временем профайлера, но столбец времени включает в себя количество времени, которое AJAX-вызов взял, чтобы поговорить с сервером. Это означает, что столбец времени неверен, если вы ищете только скорость выполнения JavaScript.

Это худшее: поскольку время, среднее время, мин и максимальное количество вложенных вызовов функций, все они неверны, если вы используете AJAX. Кроме того, любая функция, которая в конечном итоге использует AJAX (во вложенном вызове функции), также сообщит о своем времени неправильно. Это означает, что многие функции могут сообщать неверную информацию! Поэтому не доверяйте ни одному из этих столбцов, пока Firebug не устранит проблему. (Возможно, они предполагали, что поведение должно быть таким образом, хотя в лучшем случае это путает их так.)

Если вы не используете AJAX, тогда возникает другая проблема; сообщите нам, есть ли вы или нет.

Ответ 2

Если я правильно понимаю вещи, это выглядит примерно так:

В первой строке вы увидите, что собственное время "всего 0,006 мс". Это означает, что хотя время, проведенное в этой функции, составляло 783.506 мсек, большая часть из них была потрачена внутри функций, вызываемых из этой функции.

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

Ответ 3

Из Учебное пособие по Firebug - ведение журнала, профилирование и CommandLine (часть II): (примеры хороши)

Столбцы и описание Profiler

Столбец функций. Он отображает имя каждой функции.
Столбец вызовов. Он показывает количество попыток вызова определенной функции.
Процент столбца. Он показывает время, затрачиваемое на каждую функцию в процентах.
Строка времени. Показывает продолжительность выполнения от начальной точки функции до конечной точки функции.
Средний столбец. Он показывает среднее время выполнения конкретной функции. Если вы вызываете функцию только один раз, вы не увидите различий. Если вы звоните более одного раза, вы увидите различия.
      Формула для этой колонки:       Avg = Собственный Ttime/Call;
Столбец Min и столбец Max. Он показывает минимальное время выполнения конкретной функции.
Столбец: имя файла файла, в котором находится функция.

Ответ 4

Из того, что я понимаю, это то, как это работает... Общее время профайлера - это сумма столбца "Собственное время". Однако вы можете заметить, что некоторые значения одиночные могут быть больше, чем общее время профайлера. Эти перерывы проводились за пределами JavaScript, например. в плагине. Если ваша функция JS вызывает вызов плагина, например, и ожидает, что функция плагина вернется в JS, то время ожидания НЕ будет сообщаться по общему времени профайлера, но будет включено в столбце "Время".