Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.08.2014, 14:01
Профессор
Посмотреть профиль Найти все сообщения от newobject
 
Регистрация: 10.07.2014
Сообщений: 145

помогите соптимизировать алгоритм для V8
Проблема наблюдается только на V8. На слабом железе при быстром вводе наблюдается зависание инпута. Буквы не печатаются, а потом выскакивают разом по нескольку штук. Также, когда несколько раз жмешь бекспейс. Мое предположение, изначально, было в том, что при вводе следующего символа продолжает выполняться цикл внутри функции search, отсюда и тормоза. Я добавил что-то типа прерывания, однако ситуация не изменилась. Помогите, пожалуйста.
search=function(pattern){
   var out=[]
   var re=new RegExp(pattern, "i")
   var current_flag=window.flag
   for(var i=0; i<base.length; i++){
      if(current_flag!==window.flag) return;//вот тут прерывание
      if(base[i].match(re)) {
      base[i]=base[i].replace(/((\d{4} \d{2}-\d{3})|(\d{4} \d{2}-\d{3} \d{1}-\d{2}-\d{2}))$/, "<b>$1</b>")
      out.push(base[i])
   }
 }
return out
}

firstSearch=function(){
   d.innerHTML=""
   input.style.color=null
   var out=search(input.value)
   if(out.length<1) return secondSearch()
   var str=out.join("<br><br>")
   d.innerHTML=str
}

secondSearch=function(){
   input.style.color="red"
   d.innerHTML="Нет результатов для <b>"+input.value+"</b>"
}
onload=firstSearch
input.oninput=firstSearch
input.focus()
onkeydown=function(){input.focus(); window.flag=new Date().getTime()}


UPD:
d -- это див на странице
input -- input на странице
base -- массив ~900 строк

UPD2:
Вот возможная причина:
Насколько я себе это представляю, js однопоточен, и когда я ввожу следующий символ в input, он не может сразу отреагировать, не дождавшись завершения предыдущего поиска. Чтобы прервать этот цикл, внутри search, я устанавливаю флаг на событие нажатия клавиши, если следующяя клавиша была нажата, условие выполняется и мы выходим из цикла на текущей итерации. Это было мое предположение, но не помогло. Похоже я лоханулся в том, что событие нажатия само по себе не может наступить, не дождавшись выполнения цикла, поэтому пока цикл не выполнится, прерывание лфаг не изменится, вот в чем ошибка наверное. Но как это фиксить -- хз

Последний раз редактировалось newobject, 10.08.2014 в 14:53.
Ответить с цитированием
  #2 (permalink)  
Старый 10.08.2014, 14:20
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 19.01.2010
Сообщений: 354

Тут не нужна оптимизация под V8. Тут нужен жирный рефакторинг. Кроме того, ты приводишь только часть кода. Где объявлены d, input, base?
Ответить с цитированием
  #3 (permalink)  
Старый 10.08.2014, 14:24
Профессор
Посмотреть профиль Найти все сообщения от newobject
 
Регистрация: 10.07.2014
Сообщений: 145

Сообщение от ixth
Кроме того, ты приводишь только часть кода. Где объявлены d, input, base?
d -- это див на странице
input -- input на странице
base -- массив ~900 строк

А при чем тут рефакторинг?
Ответить с цитированием
  #4 (permalink)  
Старый 10.08.2014, 14:34
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 19.01.2010
Сообщений: 354

При том, что самая лучшая оптимизация — смена подхода. Подожди полчасика, я запощу свой вариант, может он не будет тормозить.
Ответить с цитированием
  #5 (permalink)  
Старый 10.08.2014, 14:40
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 19.01.2010
Сообщений: 354

Зачем, кстати, используются  current_flag/window.flag?
Ответить с цитированием
  #6 (permalink)  
Старый 10.08.2014, 14:48
Профессор
Посмотреть профиль Найти все сообщения от newobject
 
Регистрация: 10.07.2014
Сообщений: 145

Сообщение от ixth
Зачем, кстати, используются current_flag/window.flag?
Цитата:
Мое предположение, изначально, было в том, что при вводе следующего символа продолжает выполняться цикл внутри функции search, отсюда и тормоза. Я добавил что-то типа прерывания, однако ситуация не изменилась.
Насколько я себе это представляю, js однопоточен, и когда я ввожу следующий символ в input, он не может сразу отреагировать, не дождавшись завершения предыдущего поиска. Чтобы прервать этот цикл, внутри search, я устанавливаю флаг на событие нажатия клавиши, если следующяя клавиша была нажата, условие выполняется и мы выходим из цикла на текущей итерации. Это было мое предположение, но не помогло. Похоже я лоханулся в том, что событие нажатия само по себе не может наступить, не дождавшись выполнения цикла, поэтому пока цикл не выполнится, прерывание лфаг не изменится, вот в чем ошибка наверное. Но как это фиксить -- хз

Последний раз редактировалось newobject, 10.08.2014 в 14:52.
Ответить с цитированием
  #7 (permalink)  
Старый 10.08.2014, 14:56
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 19.01.2010
Сообщений: 354

В этом примере все продолжает тормозить? http://jsfiddle.net/ainop/g41x6tto/ Скинь куда-нибудь пример строк, которые ты используешь.
Ответить с цитированием
  #8 (permalink)  
Старый 10.08.2014, 15:03
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,138

Имхо: клинический случай ((

Оставлю тут на всякий случай http://hitech.vesti.ru/news/view/id/5351

Последний раз редактировалось MallSerg, 10.08.2014 в 15:15.
Ответить с цитированием
  #9 (permalink)  
Старый 10.08.2014, 15:15
Профессор
Посмотреть профиль Найти все сообщения от newobject
 
Регистрация: 10.07.2014
Сообщений: 145

ixth,
Да, тормозит еще сильней
пример строки
' Пупкина Светлана Николаевна товаровед (по многооборотной таре и обеспечению ж/д транспортом) 26 Отдел сбыта и транспортной логистики 5977 88-9595 5-40-20'
Ответить с цитированием
  #10 (permalink)  
Старый 10.08.2014, 15:34
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 19.01.2010
Сообщений: 354

Сообщение от newobject Посмотреть сообщение
ixth,
Да, тормозит еще сильней
пример строки
' Пупкина Светлана Николаевна товаровед (по многооборотной таре и обеспечению ж/д транспортом) 26 Отдел сбыта и транспортной логистики 5977 88-9595 5-40-20'
А, допустим, такой вариант? http://jsfiddle.net/ainop/g41x6tto/1/
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите в написать короткий скрипт для AdobeAcrobat XI. BSI Общие вопросы Javascript 1 13.08.2013 21:24
Новая система управления сайтом Scripto CMS deepslam Ваши сайты и скрипты 38 31.01.2011 14:55
Помогите создать javascript для ВКонтакте roxana_babay Оффтопик 2 19.01.2011 06:43
Помогите со скриптом для onClick! Alex13 Общие вопросы Javascript 1 04.11.2009 10:36