JavaScript приостановлен последовательно. Как мне найти то, что вызывает его паузу? - PullRequest
2 голосов
/ 26 марта 2010

У меня довольно тяжелый сайт, и я пытаюсь настроить производительность.

У меня есть функция, которая запускается от 20 до 200 раз, в зависимости от пользователя. Я вывожу время, необходимое для выполнения функции через console.time в Firefox.

Для завершения функции требуется около 4-6 мс.

Странно то, что в моем большом тесте с 200 или через эту функцию, он проходит первые 31, затем, кажется, останавливается почти на секунду, прежде чем завершить последние 170 или около того.

Однако эта «пауза» не отображается в журналах console.time, и я не запускаю никаких других функций, и объект, который передается в функцию, выглядит так же, как и все другие объекты, которые передаются. в.

Функция называется так

for (var s in thisGroup.events){
            showEvent(thisGroup.events[s])
            }

итак, я не понимаю, как или почему это внезапно остановится в самом начале. но сделать паузу только один раз, а затем продолжить.

Пауза ВСЕГДА происходит в 31-й раз с помощью функции. Я внимательно посмотрел на 'thisGroup.events [s]', через который он проходит, и он выглядит так для # 31

 
"eventId":"5106", "sid":"68", "gid":"29", "uid":"70","type":"event", "startDate":"2010-03-22","startTime":"6:00 PM","endDate":"2010-03-22","endTime":"11:00 PM","durationLength":"5", "durationTime":"5:00", "note":"", "desc":"event"

Событие сразу после паузы, # 32 выглядит так

"eventId":"5111", "sid":"68", "gid":"29", "uid":"71","type":"event", "startDate":"2010-03-22","startTime":"6:00 PM","endDate":"2010-03-22","endTime":"11:00 PM","durationLength":"5", "durationTime":"5:00", "note":"", "desc":"event"

другое событие, которое проходит без проблем, выглядит так

"eventId":"5113", "sid":"68", "gid":"29", "uid":"72","type":"event", "startDate":"2010-03-22","startTime":"4:30 PM","endDate":"2010-03-22","endTime":"11:00 PM","durationLength":"6.5", "durationTime":"6:30", "note":"", "desc":"event"

На выходах консоли оно не отображается, поскольку в самой функции есть что-то зависшее или занимающее время, так как console.time для каждого события, включая # 31,32, равно 4 мс.

Другая странная вещь заключается в том, что общее время прохождения цикла for по всему объекту составляет 1014 мс, что подходит для 200 событий по 4-6 мс каждый.

Любые предложения о том, как найти эту «паузу»? Мне очень интересно, что это постоянно происходит только между # 31 и # 32!

------------------- немного намека на проблему, но нет решения ---------------- ---

Если это выглядит как отставание от того места, где я поместил html в дом. Я удалил все виды кода, но когда я удаляю

jQuery('div#holdGroups').append(putHtml);

Это когда лаг останавливается.

Есть ли способ сделать очистку или что-то еще в приложении? Я пробовал .html, но это не лучше, и действительно хочу добавить. Во время паузы я могу сделать точный подсчет 3, что на самом деле не очень хорошо, и я не могу заставить паузу отображаться где-либо в консоли или профиле. Он показывает, что фактическое добавление занимает всего 117мс, но это довольно большой кусок html с 6 таблицами, так что я не думаю, что это слишком плохо.

-------------- дальнейшее обновление - возможно сборка мусора ?? ----------------------- Согласно нескольким ответам ниже, это может быть проблемой со сборкой мусора, хотя я не могу быть уверен.

Я попытался удалить используемые переменные, такие как переменная, которая содержит HTML, который добавляется в DOM через

 delete putHtml; 

так же, как и другие переменные, но это никак не повлияло.

Если проблема в сборке мусора, может, я собираюсь исправить это неправильно? Есть лучший способ сделать это? Есть ли способ определить, является ли сборка мусора проблемой?

Ответы [ 5 ]

2 голосов
/ 26 марта 2010

Попробуйте использовать console.profile (), а не console.time (). Это позволяет вам обернуть весь блок и получить более подробное описание происходящего.

console.profile('my profile');
for (var s in thisGroup.events){
    showEvent(thisGroup.events[s]);
}
console.profileEnd('my profile');
1 голос
/ 26 февраля 2011

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

1 голос
/ 26 марта 2010

Можно ли изменить порядок данных, чтобы увидеть, будут ли они меняться при паузе? Если это так, то это, безусловно, должно быть вызвано данными. Если нет, то я бы попытался сузить функциональность, вызванную комментированием блоков кода, пока вы не заметите, что задержка исчезла. Поэкспериментируйте с этим, и я думаю, что вы, вероятно, сможете понять, в чем проблема.

1 голос
/ 26 марта 2010

Попробуйте собрать логи в переменную [массив?] И вывести их в конце. Однажды я сделал тяжелую «штуковину» из ajax, и журналы продолжали появляться в консоли еще долго после того, как все было сделано. Консоль может быть источником задержки.

1 голос
/ 26 марта 2010

Постоянно ли это происходит между # 31 и # 32 в разных браузерах? Я предполагаю, что это как-то связано с сборщиком мусора. Кроме того, синхронизация в браузерах общеизвестно плоха . Я бы попробовал разные браузеры. Если это постоянно происходит там, то, возможно, стоит углубиться в эту итерацию кода. В противном случае, если это GC, лучше всего было бы уменьшить количество создаваемых вами объектов.

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