Тормозит неактивный кусок кода.
Помогите...
Тормозит кусок кода, который вроде как не участвует в работе... Ссылка: Карта неба. Черновик. При попытке перетащить карту мышкой, заметно сильное торможение прорисовки. Вот кусок сбойного кода: function Draw_map(server) { if (Pervy_prohod==0) { alert("чтение из формы"); RazmerKartyX=document.NASTROYKI.RazmerKartyX.value; RazmerKartyY=document.NASTROYKI.RazmerKartyY.value; //RazmerKartyX=650; //RazmerKartyY=650; Pervy_prohod=1; } ... Функция Draw_map вызывается каждый раз при изменении координат мыши и перерисовывает карту. Тормоза вызывают те две строки, которые читают данные из формы. Если их закомментировать и вместо них активировать следующие две строчки (где "=650"), то торможение исчезает, - вот тут. Да, считывание из формы сильно тормозит обработку, если постоянно вызывается... Но, для этого я и поставил alert, чтобы было видно, что этот кусок отрабатывает только один раз, при загрузке страницы, а потом он уже не работает! В чём может быть дело? |
Может я что-то не то делаю, но в хроме вкладка Profiles показывает что тормозит вот эта функция canv.onmousemove
Так что возможно вы не туда смотрите :) В общем то название функции намекает что она вызывается при перемещении мыши. И добавление в код console.log(event) показало что функция действительно вызывается при перемещении курсора мыши. А функция то какая-то навороченная. |
Ну всё правильно, canv.onmousemove вызывает внутри себя функцию Draw_map при нажатой клавише мыши. Собственно я про это писал - "Draw_map вызывается при каждом изменении координат мыши"... Вероятно поэтому на "верхнем" уровне видно, что тормозит вроде как canv.onmousemove.
Но, реальные тормоза именно в Draw_map, прочитайте пожалуйста ещё раз первое сообщение (без претензий, я сам понимаю, что написано мутновато... но как смог...). Попробую другими словами объяснить: Draw_map также вызывается в начале отображении страницы, независимо от мышки. В самом её начале проверяется значение Pervy_prohod и если ==0 , то считываются данные из формы, чтобы определить размер карты. После чего Pervy_prohod=1. Всё, дальше мы в этот кусок кода больше не проваливаемся при последующих вызовах Draw_map от перемещений мыши (об этом говорит то, что сообщение alert показывается только в самом начале). Но, тормоза исчезают, если мы в этом куске кода жёстко зададим размеры карты, вместо их считывания из формы - это показано во второй ссылке первого сообщения. Каким-то образом, этот кусок влияет на скорость отработки, несмотря на то, что все последующие разы он ОБХОДИТСЯ благодаря условию if (Pervy_prohod==0) Ну вот, не знаю как ещё объяснить... Коллеги на работе просто глаза вытаращили, потому что это полный бред с точки зрения алгоритмики и больше похоже на глюк интерпретатора ДжаваСкрипта - как будто он запоминает, что эти значения надо читать каждый раз из формы, несмотря ни на что... Всё-же надеюсь, что напортачил именно я, вот только где? |
сделай alert (RazmerKartyX + ' ' + typeof (RazmerKartyX)) - может данные имеют неудобоваримый формат? Ты в первой итерации присваиваешь в переменные значения и далее они у тебя до конца дней своих живут или меняют значение (например, при ресайзе окна)?
Кстати, тормоза во всех браузерах? Я тоже много раз едва не утешал себя мыслью, что глюк хрен знает кого, но только не меня... но в итоге в абсолютном большинстве случаев это был именно мой баг или недосмотр |
demoniqus, cпасибо огромное!!!
Принудительное приведение типа данных помогло: RazmerKartyX=parseInt(document.NASTROYKI.RazmerKartyX.value); RazmerKartyY=parseInt(document.NASTROYKI.RazmerKartyY.value); проверю ещё раз в остальных местах - наверняка ещё в куче мест приведение забыл сделать... Теперь можно и пользователям эту версию дать, хотя сам вопрос остался конечно - каким боком нерабочий кусок кода даёт такую наводку... Значения RazmerKartyX/Y неизменны, пока страница не обновилась любым способом. ЗЫ: карта везде нормально работает, кроме фаерфокса, но это старая история, я на этого тормоза забил, хоть это и неправильный подход... А указанный глюк был одинаков по скорости в Опере и Хроме. |
kuksha,
если переменные имеют "неудобоваримый формат" и при этом активно используются, то каждый раз происходит преобразование типа данных - наверное это и дает такой эффект. А как только формат стал цифровой, то и тормозить перестало. И не тормозило если вы вручную туда размеры забивали - ведь в этом случае формат тоже был числовой. |
Я на своей практике не встречал, чтобы массовое преобразование типа данных тормозило, тем более настолько критично. Пока единственное, что я встретил, так это CSS-код, который намертво убивал IE11! Хотя не буду зарекаться...
А что в твоем случае означает "тормозит": просто крайне медленно работает или вообще зависает? Если ты имеешь в виду именно мертвое зависание, то это на 99,99999% полученные значения где-то порождают просто бесконечный цикл. Ведь проблема не в указанном куске кода, а именно в тех значениях, которые тут назначаются. Я бы на твоем месте взял "скальпель" и "препарировал" эти значения, пока не понял бы причину. Фокс, кстати не такой уж тормоз. IE впереди планеты всей - по моим испытаниям вышло около 10X медленнее остальных браузеров независимо от версии (8 и 11) и платформы (ХР и Win7). Этот браузЁр полон "сюрпризов"... И по идее фокс по "всеядности" ближе к Хрому, нежели к творению MS... |
Часовой пояс GMT +3, время: 14:27. |