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 11.08.2014 10:52

ixth,
он чушь несет несусветную, там перерисовка идет только один раз, после цикла, все браузеры все перерисовывают одинаково, иначе как юзер смог бы увидеть результаты поиска? Глупо было бы.

ixth 11.08.2014 10:57

Да, но "после цикла" раньше вызывалось при каждом нажатии на клавишу. Думаю, он про это.

newobject 11.08.2014 11:00

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

newobject 11.08.2014 11:07

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

newobject 11.08.2014 11:43

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мс

MallSerg 11.08.2014 11:44

Проблема в выводе результатов
как следствие этой проблемы - пользовательский ввод ждет окончания вывода результатов.

ixth 11.08.2014 12:09

Каким образом map ведет к утечке памяти? И если придираться к мелочам, то почему ты так странно объявляешь функции?

newobject 11.08.2014 12:44

MallSerg,
Возможно ты прав, извиняюсь что нагрубил, я в шоке. :) Я сгенерил массив в несколько тысяч строк, и поставил таймеры. Цикл выполняется 1-3 миллисекунды, основное время занимает отрисовка. Это если верить отладчикам. А я им не верю. Как такое может быть? Просто, видимо выполнение цикла не учитывается толком. Буду дальше эксперементировать.

newobject 11.08.2014 12:47

Цитата:

Сообщение от ixth
Каким образом map ведет к утечке памяти?

Ну, я насколько помню, "родная" реализация map рекурсивная. Возможно они так и сделали.
>>
Цитата:

Сообщение от ixth
И если придираться к мелочам, то почему ты так странно объявляешь функции?

Просто привычка. А это имеет какое-то значение?

ixth 11.08.2014 13:12

Цитата:

Сообщение от newobject (Сообщение 325315)
Ну, я насколько помню, "родная" реализация map рекурсивная. Возможно они так и сделали.

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

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

Цитата:

Сообщение от newobject (Сообщение 325315)
Просто привычка. А это имеет какое-то значение?

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

Цитата:

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

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


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