Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Тормозит неактивный кусок кода. (https://javascript.ru/forum/misc/54591-tormozit-neaktivnyjj-kusok-koda.html)

kuksha 23.03.2015 23:27

Тормозит неактивный кусок кода.
 
Помогите...
Тормозит кусок кода, который вроде как не участвует в работе...
Ссылка: Карта неба. Черновик.
При попытке перетащить карту мышкой, заметно сильное торможение прорисовки.

Вот кусок сбойного кода:
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, чтобы было видно, что этот кусок отрабатывает только один раз, при загрузке страницы, а потом он уже не работает!

В чём может быть дело?

Shasoft 23.03.2015 23:45

Может я что-то не то делаю, но в хроме вкладка Profiles показывает что тормозит вот эта функция canv.onmousemove
Так что возможно вы не туда смотрите :)

В общем то название функции намекает что она вызывается при перемещении мыши. И добавление в код console.log(event) показало что функция действительно вызывается при перемещении курсора мыши. А функция то какая-то навороченная.

kuksha 24.03.2015 08:04

Ну всё правильно, 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)

Ну вот, не знаю как ещё объяснить...

Коллеги на работе просто глаза вытаращили, потому что это полный бред с точки зрения алгоритмики и больше похоже на глюк интерпретатора ДжаваСкрипта - как будто он запоминает, что эти значения надо читать каждый раз из формы, несмотря ни на что... Всё-же надеюсь, что напортачил именно я, вот только где?

demoniqus 24.03.2015 16:04

сделай alert (RazmerKartyX + ' ' + typeof (RazmerKartyX)) - может данные имеют неудобоваримый формат? Ты в первой итерации присваиваешь в переменные значения и далее они у тебя до конца дней своих живут или меняют значение (например, при ресайзе окна)?
Кстати, тормоза во всех браузерах?
Я тоже много раз едва не утешал себя мыслью, что глюк хрен знает кого, но только не меня... но в итоге в абсолютном большинстве случаев это был именно мой баг или недосмотр

kuksha 24.03.2015 21:52

demoniqus, cпасибо огромное!!!
Принудительное приведение типа данных помогло:
RazmerKartyX=parseInt(document.NASTROYKI.RazmerKartyX.value);
RazmerKartyY=parseInt(document.NASTROYKI.RazmerKartyY.value);

проверю ещё раз в остальных местах - наверняка ещё в куче мест приведение забыл сделать...
Теперь можно и пользователям эту версию дать, хотя сам вопрос остался конечно - каким боком нерабочий кусок кода даёт такую наводку...
Значения RazmerKartyX/Y неизменны, пока страница не обновилась любым способом.
ЗЫ:
карта везде нормально работает, кроме фаерфокса, но это старая история, я на этого тормоза забил, хоть это и неправильный подход... А указанный глюк был одинаков по скорости в Опере и Хроме.

Shasoft 24.03.2015 23:10

kuksha,
если переменные имеют "неудобоваримый формат" и при этом активно используются, то каждый раз происходит преобразование типа данных - наверное это и дает такой эффект. А как только формат стал цифровой, то и тормозить перестало. И не тормозило если вы вручную туда размеры забивали - ведь в этом случае формат тоже был числовой.

demoniqus 25.03.2015 12:38

Я на своей практике не встречал, чтобы массовое преобразование типа данных тормозило, тем более настолько критично. Пока единственное, что я встретил, так это CSS-код, который намертво убивал IE11! Хотя не буду зарекаться...
А что в твоем случае означает "тормозит": просто крайне медленно работает или вообще зависает? Если ты имеешь в виду именно мертвое зависание, то это на 99,99999% полученные значения где-то порождают просто бесконечный цикл. Ведь проблема не в указанном куске кода, а именно в тех значениях, которые тут назначаются. Я бы на твоем месте взял "скальпель" и "препарировал" эти значения, пока не понял бы причину.
Фокс, кстати не такой уж тормоз. IE впереди планеты всей - по моим испытаниям вышло около 10X медленнее остальных браузеров независимо от версии (8 и 11) и платформы (ХР и Win7). Этот браузЁр полон "сюрпризов"...
И по идее фокс по "всеядности" ближе к Хрому, нежели к творению MS...


Часовой пояс GMT +3, время: 18:37.