Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.03.2015, 23:27
Новичок на форуме
Отправить личное сообщение для kuksha Посмотреть профиль Найти все сообщения от kuksha
 
Регистрация: 26.12.2011
Сообщений: 9

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

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

В чём может быть дело?
Ответить с цитированием
  #2 (permalink)  
Старый 23.03.2015, 23:45
Аватар для Shasoft
Профессор
Отправить личное сообщение для Shasoft Посмотреть профиль Найти все сообщения от Shasoft
 
Регистрация: 03.03.2009
Сообщений: 156

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

В общем то название функции намекает что она вызывается при перемещении мыши. И добавление в код console.log(event) показало что функция действительно вызывается при перемещении курсора мыши. А функция то какая-то навороченная.
Ответить с цитированием
  #3 (permalink)  
Старый 24.03.2015, 08:04
Новичок на форуме
Отправить личное сообщение для kuksha Посмотреть профиль Найти все сообщения от kuksha
 
Регистрация: 26.12.2011
Сообщений: 9

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

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

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

Последний раз редактировалось kuksha, 24.03.2015 в 08:30.
Ответить с цитированием
  #4 (permalink)  
Старый 24.03.2015, 16:04
Профессор
Отправить личное сообщение для demoniqus Посмотреть профиль Найти все сообщения от demoniqus
 
Регистрация: 28.05.2008
Сообщений: 181

сделай alert (RazmerKartyX + ' ' + typeof (RazmerKartyX)) - может данные имеют неудобоваримый формат? Ты в первой итерации присваиваешь в переменные значения и далее они у тебя до конца дней своих живут или меняют значение (например, при ресайзе окна)?
Кстати, тормоза во всех браузерах?
Я тоже много раз едва не утешал себя мыслью, что глюк хрен знает кого, но только не меня... но в итоге в абсолютном большинстве случаев это был именно мой баг или недосмотр
Ответить с цитированием
  #5 (permalink)  
Старый 24.03.2015, 21:52
Новичок на форуме
Отправить личное сообщение для kuksha Посмотреть профиль Найти все сообщения от kuksha
 
Регистрация: 26.12.2011
Сообщений: 9

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

проверю ещё раз в остальных местах - наверняка ещё в куче мест приведение забыл сделать...
Теперь можно и пользователям эту версию дать, хотя сам вопрос остался конечно - каким боком нерабочий кусок кода даёт такую наводку...
Значения RazmerKartyX/Y неизменны, пока страница не обновилась любым способом.
ЗЫ:
карта везде нормально работает, кроме фаерфокса, но это старая история, я на этого тормоза забил, хоть это и неправильный подход... А указанный глюк был одинаков по скорости в Опере и Хроме.
Ответить с цитированием
  #6 (permalink)  
Старый 24.03.2015, 23:10
Аватар для Shasoft
Профессор
Отправить личное сообщение для Shasoft Посмотреть профиль Найти все сообщения от Shasoft
 
Регистрация: 03.03.2009
Сообщений: 156

kuksha,
если переменные имеют "неудобоваримый формат" и при этом активно используются, то каждый раз происходит преобразование типа данных - наверное это и дает такой эффект. А как только формат стал цифровой, то и тормозить перестало. И не тормозило если вы вручную туда размеры забивали - ведь в этом случае формат тоже был числовой.
Ответить с цитированием
  #7 (permalink)  
Старый 25.03.2015, 12:38
Профессор
Отправить личное сообщение для demoniqus Посмотреть профиль Найти все сообщения от demoniqus
 
Регистрация: 28.05.2008
Сообщений: 181

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как заменить данный кусок кода, чтобы он корректно работал в extjs5? Risa ExtJS 3 05.02.2015 22:24
скрыть из исходного кода часть javascript кода. javasc Javascript под браузер 10 12.03.2014 09:32
Обновить кусок кода с версии 1.4.2 до новой Daria_111 jQuery 5 19.12.2012 18:09
Зацените кусок кода prowoke Общие вопросы Javascript 2 13.07.2011 10:58
Вывести исходный кусок кода. Jurasmi jQuery 2 10.12.2009 11:28