Цитата:
|
Дзен-трансгуманист,
Ну я имею ввиду чо ранее был интерпретатор, в сейчас для функций массивов уже скомпилированный код |
Цитата:
То есть какие отличия {0:'a'}[0] от ['a'][0] ? Преобразование нуля в строку идет в обоих случаях? |
Кстати, почему-то в хроме доступ к свойствам, если явно использовать строки в качестве ключей, медленней раз в десять..
(function(){ var o = {0:'a', 1: 'b'}; console.time('t2'); for (var j = 0; j < 100000000; j++) { o['0']; o['1']; } console.timeEnd('t2'); })(); (function(){ var o = {0:'a', 1: 'b'}; console.time('t'); for (var j = 0; j < 100000000; j++) { o[0]; o[1]; } console.timeEnd('t'); })(); |
Cваял версию 2
var arr = [], arrLng = 6000, out=[]; for (var i = 0; i < arrLng; i++) { arr.push(parseInt(Math.random()*arrLng)) } //====== Deff ========= var st = +new Date(), bound = ','; out=[]; var tststr = bound + arr.join(bound) + bound; for (var i = 0; i < arr.length; i++) { var t = bound +arr[i] + bound; if(tststr.indexOf(t)==tststr.lastIndexOf(t))out.push(arr[i]) } var work = +new Date()-st; alert('Deff ='+work+'\n\n'+out) //====== Deff v2 ========= var st = +new Date(), obj ={}; out=[]; for (var i = 0; i < arr.length; i++) { if(obj[arr[i]]){obj[arr[i]]='D'} //Дубль else obj[arr[i]] = i; } for (var key in obj) { if(obj[key]!='D') out[obj[key]] = key } out = out.join(',').replace(/^,+/,'').replace(/,+$/,'').split(/,+/) var work = +new Date()-st; alert('Deff v2 ='+work+'\n\n'+out) //===== danik ========== var st = +new Date(); out=[]; for (var i = 0; i < arr.length; i++) { var item = arr[i]; if (arr.indexOf(item, i + 1) === -1 && (i === 0 || arr.lastIndexOf(item, i - 1) === -1)) out.push(item); } var work = +new Date()-st; alert('danik ='+work+'\n\n'+out) //===== рони ========== var st = +new Date(); out=[]; arr.sort(function (a, b) { return a - b; }); for (var i = 0; i < arr.length; i++) { var item = arr[i]; if (item != arr[i - 1] && arr[i + 1] != item) out.push(item); } var work = +new Date()-st; alert('рони ='+work+'\n\n'+out) |
Цитата:
Цитата:
|
Цитата:
Но многих операций в теории можно избежать с помощью всяких эвристических оптимизаций. Например, движок может не определять у массива свойство length, если анализ семантического дерева показывает, что оно ни разу не используется. А может не то что не определять никаких свойств, а даже и вообще не создавать "JS-объект" как таковой: если известно, что аксессоры используют только ключи целочисленного типа, то достаточно выделить голый индексированный список с простой интеграцией ссылок в инфраструктуру сборщика мусора. Накладные расходы будут близки к минимальным. |
Цитата:
Отбросил медленные варианты: (function(){ var array = [], arrayLength = 6000; for (var i = 0; i < arrayLength; i++) { array.push(parseInt(Math.random()*arrayLength)); } /** * @author рони **/ function test1() { var result = []; var clone = array.slice(); clone.sort(function (a, b) { return a - b; }); for (var i = 0; i < clone.length; i++) { var item = clone[i]; if (item != clone[i - 1] && clone[i + 1] != item) result.push(item); } return result; } /** * @author Deff **/ function test2() { var obj ={}; var result = []; for (var i = 0; i < array.length; i++) { if(obj[array[i]]){ delete obj[array[i]]; continue; } obj[array[i]] = i; } for (var key in obj) { result[obj[key]] = key; } result = result.join(',').replace(/^,+/,'').replace(/,+$/,'').split(/,+/); return result; } /** * @author Дзен-трансгуманист (danik.js edition) **/ function test3(){ var uniqueness = []; var result = []; for (var i = 0; i < array.length; i++) { var item = array[i]; switch (uniqueness[item]) { case undefined: uniqueness[item] = true; break; case true: uniqueness[item] = false; } } for (var i = 0; i < array.length; i++) { var item = array[i]; if (uniqueness[item]) result.push(item); } return result; } /** * @author Дзен-трансгуманист **/ function test4(){ var uniqueness = new Map(); var result = []; for ( var i = 0; i < array.length; i++ ) { var value = array[ i ]; switch ( uniqueness.get( value )) { case undefined: uniqueness.set( value, true ); break; case true: uniqueness.set( value, false ); } } for ( var i = 0; i < array.length; i++ ) { var item = array[ i ]; if ( uniqueness.get( value ) ) result.push( item ); } return result; } console.time('рони'); for (var i = 0; i < 100; i++) test1(); console.timeEnd('рони') console.time('Deff'); for (var i = 0; i < 100; i++) test2(); console.timeEnd('Deff') console.time('Дзен-трансгуманист (danik.js edition)'); for (var i = 0; i < 100; i++) test3(); console.timeEnd('Дзен-трансгуманист (danik.js edition)') console.time('Дзен-трансгуманист'); for (var i = 0; i < 100; i++) test4(); console.timeEnd('Дзен-трансгуманист') })(); В хроме вариант с Map() на большом массиве медленней чем с []. В файрфоксе наоборот... |
|
Deff, консоль открой. От тебя не ожидал )))
Чтоб отработал вариант с Map() надо в chrome://flags включить harmony В фф не знаю, у меня работает. Обнови фф или покопайся в настройках. |
Часовой пояс GMT +3, время: 11:52. |