Javascript.RU

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

ixth,
он чушь несет несусветную, там перерисовка идет только один раз, после цикла, все браузеры все перерисовывают одинаково, иначе как юзер смог бы увидеть результаты поиска? Глупо было бы.
Ответить с цитированием
  #22 (permalink)  
Старый 11.08.2014, 10:57
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 19.01.2010
Сообщений: 354

Да, но "после цикла" раньше вызывалось при каждом нажатии на клавишу. Думаю, он про это.
Ответить с цитированием
  #23 (permalink)  
Старый 11.08.2014, 11:00
Профессор
Посмотреть профиль Найти все сообщения от newobject
 
Регистрация: 10.07.2014
Сообщений: 145

Да, может и про это, и это тоже чушь. Браузер не может заранее знать, в какой момент будет нажата следующая клавиша, и будет ли нажата. Может быть там установлены таймауты минммальные, но это не принципиально. Визуально не видно никаких задержек, все выводится моментально.

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

ixth,
Проблема там не в выводе результатов, а в том, что во время выполнения цикла пользовательский ввод не может попасть в инпут, он ждет окончания цикла.
Ответить с цитированием
  #25 (permalink)  
Старый 11.08.2014, 11:43
Профессор
Посмотреть профиль Найти все сообщения от newobject
 
Регистрация: 10.07.2014
Сообщений: 145

ixth,
Да, кстати, я там заметил, что ты в своем коде используешь map для массива, типа, декларативное рулит, да, но это еще дополнительные тормоза+утечки памяти, возможно. Не надо так делать. Я вот тут протестил немножко
test=function(f, i){
	console.time(f.name)
		while(i--){f()}
	console.timeEnd(f.name)
}


mymap=function(arr, f){
   var newArr=[]
   for(var i=0; i<arr.length; i++){
      newArr[i]=f(arr[i])
   }
   return newArr
}

mymappush=function(arr, f){
   var newArr=[]
   for(var i=0; i<arr.length; i++){
       newArr.push(f(arr[i]))
   }
   return newArr
}

thismap=function(f){
   var newArr=[]
   for(var i=0; i<this.length; i++){
      newArr[i]=f(this[i])
   }
   return newArr
}


thismappush=function(f){
   var newArr=[]
   for(var i=0; i<this.length; i++){
       newArr.push(f(this[i]))
   }
   return newArr
}




arr=[0,1,2,3,4,5,6,7,8,9]

f=function(x){return x}
arr.thismap=thismap
arr.thismappush=thismappush

function tst_mymap(){
   mymap(arr, f)
}
function tst_mymappush(){
   mymappush(arr, f)
}
function tst_thismap(){
  arr.thismap(f)
}

function tst_thismappush(){
  arr.thismappush(f)
}

function tst_native_map(){
   arr.map(f)
}

i=100000
test_=function(f){return test(f, i)}

test_(tst_mymap)
test_(tst_mymappush)
test_(tst_thismap)
test_(tst_thismappush)
test_(tst_native_map)


//tst_mymap: 77ms
//tst_mymappush: 38ms
//tst_thismap: 75ms
//tst_thismappush: 81ms
//tst_native_map: 301ms


Тестил только на ноде, но результат как бы намекает. Врядли оно хот где-то быстрей будет.
ЗЫ к моему удивлению, в старой опере действительно быстрей

Started: tst_mymap
tst_mymap: 7363ms (7362900µsec)
Started: tst_mymappush
tst_mymappush: 8298ms (8298206µsec)
Started: tst_thismap
tst_thismap: 6963ms (6963449µsec)
Started: tst_thismappush
tst_thismappush: 8201ms (8200867µsec)
Started: tst_native_map
tst_native_map: 5507ms (5506914µsec)

Но в хроме:
tst_mymap: 32.000ms
tst_mymappush: 29.000ms
tst_thismap: 31.000ms
tst_thismappush: 27.000ms
tst_native_map: 460.000ms

В фф
[11:55:18.280] tst_mymap: таймер запущен
[11:55:18.420] tst_mymap: 140мс
[11:55:18.420] tst_mymappush: таймер запущен
[11:55:18.562] tst_mymappush: 142мс
[11:55:18.562] tst_thismap: таймер запущен
[11:55:18.711] tst_thismap: 149мс
[11:55:18.712] tst_thismappush: таймер запущен
[11:55:18.872] tst_thismappush: 160мс
[11:55:18.873] tst_native_map: таймер запущен
[11:55:19.166] tst_native_map: 293мс

Последний раз редактировалось newobject, 11.08.2014 в 12:00.
Ответить с цитированием
  #26 (permalink)  
Старый 11.08.2014, 11:44
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,127

Проблема в выводе результатов
как следствие этой проблемы - пользовательский ввод ждет окончания вывода результатов.
Ответить с цитированием
  #27 (permalink)  
Старый 11.08.2014, 12:09
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 19.01.2010
Сообщений: 354

Каким образом map ведет к утечке памяти? И если придираться к мелочам, то почему ты так странно объявляешь функции?
Ответить с цитированием
  #28 (permalink)  
Старый 11.08.2014, 12:44
Профессор
Посмотреть профиль Найти все сообщения от newobject
 
Регистрация: 10.07.2014
Сообщений: 145

MallSerg,
Возможно ты прав, извиняюсь что нагрубил, я в шоке. Я сгенерил массив в несколько тысяч строк, и поставил таймеры. Цикл выполняется 1-3 миллисекунды, основное время занимает отрисовка. Это если верить отладчикам. А я им не верю. Как такое может быть? Просто, видимо выполнение цикла не учитывается толком. Буду дальше эксперементировать.
Ответить с цитированием
  #29 (permalink)  
Старый 11.08.2014, 12:47
Профессор
Посмотреть профиль Найти все сообщения от newobject
 
Регистрация: 10.07.2014
Сообщений: 145

Сообщение от ixth
Каким образом map ведет к утечке памяти?
Ну, я насколько помню, "родная" реализация map рекурсивная. Возможно они так и сделали.
>>
Сообщение от ixth
И если придираться к мелочам, то почему ты так странно объявляешь функции?
Просто привычка. А это имеет какое-то значение?
Ответить с цитированием
  #30 (permalink)  
Старый 11.08.2014, 13:12
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 19.01.2010
Сообщений: 354

Сообщение от newobject Посмотреть сообщение
Ну, я насколько помню, "родная" реализация map рекурсивная. Возможно они так и сделали.
Родная реализация может измениться в любой момент. Принцип мапа в том, что для всех элементов массива вызывается функция, которая преобразует их значение и помещает в другой массив: никакой рекурсией тут не пахнет. Кроме того, гугл про утечки памяти в связи в map ничего не пишет: https://www.google.com/search?q=memo...s+array+map+js

Но да, он медленнее. Т.к. у тебя критичное к скорости место, можешь заменить на for, ничего не имею против, просто мне было удобнее написать с мапом.

Сообщение от newobject Посмотреть сообщение
Просто привычка. А это имеет какое-то значение?
Это излишне многословно. Ты создаешь переменную и присваиваешь ей function expression вместо того, чтобы сразу написать function declaration. Просто лишние телодвижения. Кроме того, твои переменные хойстятся и до присвоения, условно говоря, имя функции есть, а самой функции нет. Кроме того, у функции, объявленной через function expression нет arguments.callee.name. Должны быть еще какие-то тонкие нюансы, но это надо глубоко в спецификацию лезть, а мне лень. В учебнике рекомендуется использовать function declaration почти во всех случаях:

Цитата:
Function Declaration короче и лучше читается. Дополнительный бонус — такие функции можно вызывать до того, как они объявлены.

Используйте Function Expression только там, где это действительно нужно. Например, для объявления функции в зависимости от условий.
И да, ответь мне в той теме, где я показал результаты профайлинга.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите в написать короткий скрипт для 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