Медленное выполнение javascript в хроме, выход профилировщика "(программа)"
Как я могу определить, какие зависания находятся в моем приложении javascript, когда профайлер ставит (программу) вверху на 80%? Является ли моя логика слишком сложной для отслеживания хот-спота? Является ли слишком большой объем памяти? Что вообще является причиной этого?
Дополнительная информация:
Ответы
Ответ 1
Циклы бездействия ( "ничего не делают" ) также будут отображаться как "(программа)" (вы можете профилировать эту страницу SO в течение нескольких секунд и получить 100% от (программы)), так что это не является признаком чего-то плохого само по себе.
Другое дело, когда вы действительно видите, что ваше приложение отстает. Затем (program) будет внесен код привязки V8 (и код WebCore, который они вызывают, что по существу: операции DOM/CSS, рисование, выделения памяти и GC, что нет.) Если это в этом случае вы можете записать Временную шкалу вашего приложения (переключитесь на панель Timeline
в Инструментах разработчика и нажмите кнопку Record
в нижней строке состояния, а затем запустите приложение на некоторое время.) Вы увидите много внутренних событий со своими таймингами в виде горизонтальных баров. Вы увидите пересчеты, пересчеты стиля, запуск таймеров, события GC и т.д. (Кстати, последние версии Chromium имеют улучшенную временную шкалу использования профилей памяти, поэтому вы также сможете контролировать память, используемую некоторыми внутренними факторами.)
Чтобы диагностировать проблемы памяти (множественные распределения, связанные с несколькими циклами полного GC), вы можете использовать панель Profiles
. Возьмите снимок кучи, прежде чем начнется интенсивная часть вашего кода, а другая - после того, как этот код запустится некоторое время. Затем сравните два кучи (правый SELECT внизу), чтобы увидеть, какие распределения произошли, и их влияние на память.
Ответ 2
Чтобы проверить, работает ли медленное из-за использования памяти, используйте: chrome://memory
Также вы можете проверить chrome://profiler/
на предмет возможных подсказок о том, что происходит.
Другой вариант - разместить здесь свой код javascript.
Ответ 3
См. эту ссылку: это поможет вам в Понимание профайлера Firebug
Я бы сказал, что вы должны проверить, какие методы принимают%. Вы можете свести к минимуму нежелательные процедуры. Я видел в вашей фигуре, если какой-то метод draw
потребляет около 14%, который работает в фоновом режиме. Возможно, из-за этого ваша JS-загрузка медленно. Вы должны определить, что займет время. У FF и Chrome есть функция, показывающая сетевой трафик. Посмотрите yslow, у них есть отличный аддон Firebug.
Я бы предложил некоторые инструменты аудита Chome, которые могут рассказать вам много о том, почему это происходит, вероятно, вы должны включить дополнительную информацию о:
- сколько времени потребовалось для подключения к серверу?
- сколько времени потребовалось для передачи контента?
- сколько других вещей вы загружаете на эту страницу одновременно?
в любом случае даже без этого, вот контрольный список для повышения производительности для вас:
- убедитесь, что ваш javascript обрабатывается и служит статическим контентом, например. через nginx/apache/безотносительно напрямую или cdn, не попадая в рамки вашего приложения.
- исследуйте, можете ли вы использовать CDN для обслуживания javascript, иногда даже указывая на другие серверы разные имена доменов, оказывает положительное влияние, например. вместо
http://example.com/blah.js
→ http://cdn2.example.com/blah.js
- убедитесь, что ваш js обслуживается с соответствующими заголовками истечения срока действия, не перегружайте его каждый раз, когда клиент обновляет страницу
- включить gzipping содержимого js
- минимизировать ваши js с помощью различных доступных инструментов (например, с помощью компилятора Google закрытия).
- объединить ваши скрипты (уменьшает количество запросов)
- поставьте теги script непосредственно перед
- исследовать и очищать/оптимизировать ваши загрузочные и document.ready-крючки
Посмотрите плагин YSlow и Google PageSpeed , что очень полезно для повышения производительности.