Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   помогите соптимизировать алгоритм для V8 (https://javascript.ru/forum/misc/49366-pomogite-soptimizirovat-algoritm-dlya-v8.html)

newobject 10.08.2014 14:01

помогите соптимизировать алгоритм для 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, я устанавливаю флаг на событие нажатия клавиши, если следующяя клавиша была нажата, условие выполняется и мы выходим из цикла на текущей итерации. Это было мое предположение, но не помогло. Похоже я лоханулся в том, что событие нажатия само по себе не может наступить, не дождавшись выполнения цикла, поэтому пока цикл не выполнится, прерывание лфаг не изменится, вот в чем ошибка наверное. Но как это фиксить -- хз

ixth 10.08.2014 14:20

Тут не нужна оптимизация под V8. Тут нужен жирный рефакторинг. Кроме того, ты приводишь только часть кода. Где объявлены d, input, base?

newobject 10.08.2014 14:24

Цитата:

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

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

А при чем тут рефакторинг?

ixth 10.08.2014 14:34

При том, что самая лучшая оптимизация — смена подхода. Подожди полчасика, я запощу свой вариант, может он не будет тормозить.

ixth 10.08.2014 14:40

Зачем, кстати, используются  current_flag/window.flag?

newobject 10.08.2014 14:48

Цитата:

Сообщение от ixth
Зачем, кстати, используются current_flag/window.flag?

Цитата:

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

ixth 10.08.2014 14:56

В этом примере все продолжает тормозить? http://jsfiddle.net/ainop/g41x6tto/ Скинь куда-нибудь пример строк, которые ты используешь.

MallSerg 10.08.2014 15:03

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

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

newobject 10.08.2014 15:15

ixth,
Да, тормозит еще сильней
пример строки
' Пупкина Светлана Николаевна товаровед (по многооборотной таре и обеспечению ж/д транспортом) 26 Отдел сбыта и транспортной логистики 5977 88-9595 5-40-20'

ixth 10.08.2014 15:34

Цитата:

Сообщение от newobject (Сообщение 325163)
ixth,
Да, тормозит еще сильней
пример строки
' Пупкина Светлана Николаевна товаровед (по многооборотной таре и обеспечению ж/д транспортом) 26 Отдел сбыта и транспортной логистики 5977 88-9595 5-40-20'

А, допустим, такой вариант? http://jsfiddle.net/ainop/g41x6tto/1/


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