Я пытался использовать профилировщик 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**
Между этими двумя результатами сумма результатов Time намного больше 464,323.
Итак, что означают эти различные числа? Каким из них я должен доверять?
Я сам это заметил. Это происходит в некоторых рекурсивных функциях, поэтому я предполагаю, что он, возможно, подсчитывает каждый экземпляр отдельно и суммирует результаты.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если я правильно понимаю, это выглядит примерно так:
В первой строке вы увидите, что собственное время составляет «всего 0,006 мс». Это означает, что хотя время, потраченное на эту функцию, составило 783,506 мс, большая часть его была потрачена внутри функций, вызванных из этой функции.
Когда я использую Firebug для оптимизации кода, я стараюсь сократить «собственное время» функций, которые вызываются чаще всего. (очевидно, также проверяя любые ненужные вызовы функций для полного удаления)
В каждом столбце есть описание того, что это означает, если вы установите курсор мыши над ним в Firebug. Я предполагаю, что тогда вы сможете прочитать, как работает каждый столбец самостоятельно. Однако вы определенно столкнулись со странным поведением, которое необходимо объяснить.
собственное время - это количество времени, которое функция потратила на выполнение кода внутри себя. Если функция не вызывает других функций, то собственное время должно быть таким же, как время. Однако, если есть вызовы вложенных функций, то время также подсчитывает время, потраченное на их выполнение. Следовательно, время почти всегда будет больше, чем собственное время, и в большинстве случаев в сумме будет больше, чем общее время, сообщаемое профилировщиком.
Однако ни одна функция не замужемвремя не должна быть больше, чем общее время, в течение которого профилировщик регистрируется для вызовов JavaScript. Эта проблема определенно является ошибкой, и я понимаю, почему вы не доверяете Firebug, когда он дает такой парадоксальный результат. Я считаю, что выяснил причину возникновения этой ошибки: AJAX.
Похоже, что вызовы AJAX приводят к тому, что столбцы, которые подсчитывают вызовы вложенных функций, сообщают неверную информацию. В итоге они подсчитывают время выполнения JavaScript и запроса к серверу.
Вы можете воспроизвести эту ошибку профилировщика, выполнив следующие действия:
В этом примере, что касается время по сравнению с собственное время, собственное время каждой функции добавляет к общему времени профилировщика, но столбец время включает количество времени, которое потребовалось вызову AJAX для разговора с сервером. Это означает, что столбец время неверен, если вы ищете только скорость выполнения JavaScript.
Становится хуже: поскольку все время, среднее время, мин и Максимум подсчитывают вызовы вложенных функций, все они неверны, если вы используете AJAX. Кроме того, любая функция, которая в конечном итоге использует AJAX (при вызове вложенной функции), также будет неправильно сообщать свое время. Это означает, что многие функции могут сообщать неверную информацию! Так что пока не доверяйте ни одному из этих столбцов, пока Firebug не исправит проблему. (Возможно, они задумали такое поведение, хотя оставлять это таким образом в лучшем случае сбивает с толку.)
Если вы не используете AJAX, возникает другая проблема; дайте нам знать, есть вы или нет.
Оставил комментарий к самому вопросу; Я все еще вижу страницы, не использующие AJAX, у которых «время» больше, чем общее время профиля. Очень запутанно. Есть идеи, что могло вызвать это, кроме AJAX?
От Учебник Firebug - ведение журнала, профилирование и командная строка (часть II): (примеры есть хорошие)
Columns and Description of Profiler
Function column : It show the name of each function.
Call column : It shows the count of how many a particular function has been invoked.
Percent column : It shows the time consuming of each function in percentage.
Time column : It shows the duration of execution from start point of a function to the end point of a function.
Avg column : It shows the average execution time of a particular function. If you are calling a function one time only, you won’t see the differences. If you are calling more than one time, you will see the differences.
The formula for that column is
Avg = Own Ttime / Call;
Min column and Max column: It shows the minimum execution time of a particular function.
File column: the file name of file where the function located.
Насколько я понимаю, это работает так ... общее время профилировщика - это сумма столбца «Собственное время». Однако вы можете заметить, что некоторые значения не замужем Time могут быть больше, чем общее время профилировщика. Эти сверхурочные часы были потрачены вне JavaScript, например. в вызове плагина. Если ваша функция JS выполняет вызов плагина, например, и ожидает, пока функция плагина вернется в JS, то это время ожидания НЕ будет сообщаться общим временем профилировщика, но будет включено в столбец Время.
К вашему сведению, я все еще вижу ту же проблему, и на странице, где нет использует AJAX. Я вижу, что общее время профилирования для моей страницы составляет 17 секунд, а в первой строке консоли указано «время» 24 секунды. Я понятия не имею, как это интерпретировать.