Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #31 (permalink)  
Старый 19.02.2014, 23:35
Аватар для Дзен-трансгуманист
√₋̅₁̅
Отправить личное сообщение для Дзен-трансгуманист Посмотреть профиль Найти все сообщения от Дзен-трансгуманист
 
Регистрация: 18.06.2012
Сообщений: 385

Сообщение от Deff
походу в в WEBkit работа с массивами уже переведена на аппаратный уровень
ага, ага, прямо на GPU
__________________

Гейзенберг, возможно, читал этот тред.
Ответить с цитированием
  #32 (permalink)  
Старый 19.02.2014, 23:40
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Дзен-трансгуманист,
Ну я имею ввиду чо ранее был интерпретатор, в сейчас для функций массивов уже скомпилированный код
Ответить с цитированием
  #33 (permalink)  
Старый 19.02.2014, 23:45
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Дзен-трансгуманист
из-за преобразования чисел в строку
Я понимаю. Попытался чуть-чуть отыграть заменив объект дырявым массивом. Кстати, интересует вопрос: доступ к свойствам объекта отличается от доступа к элементам массива?
То есть какие отличия {0:'a'}[0] от ['a'][0] ? Преобразование нуля в строку идет в обоих случаях?
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #34 (permalink)  
Старый 19.02.2014, 23:58
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Кстати, почему-то в хроме доступ к свойствам, если явно использовать строки в качестве ключей, медленней раз в десять..

(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');
})();
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #35 (permalink)  
Старый 20.02.2014, 00:13
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

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)

Последний раз редактировалось Deff, 20.02.2014 в 01:20.
Ответить с цитированием
  #36 (permalink)  
Старый 20.02.2014, 00:20
Аватар для Дзен-трансгуманист
√₋̅₁̅
Отправить личное сообщение для Дзен-трансгуманист Посмотреть профиль Найти все сообщения от Дзен-трансгуманист
 
Регистрация: 18.06.2012
Сообщений: 385

Сообщение от danik.js
Кстати, интересует вопрос: доступ к свойствам объекта отличается от доступа к элементам массива?
Угу, отличается: Properties of Array Instances

Цитата:
Array objects use a variation of the [[DefineOwnProperty]] internal method used for other native ECMAScript objects.
__________________

Гейзенберг, возможно, читал этот тред.
Ответить с цитированием
  #37 (permalink)  
Старый 20.02.2014, 00:38
Аватар для Дзен-трансгуманист
√₋̅₁̅
Отправить личное сообщение для Дзен-трансгуманист Посмотреть профиль Найти все сообщения от Дзен-трансгуманист
 
Регистрация: 18.06.2012
Сообщений: 385

Сообщение от danik.js
То есть какие отличия {0:'a'}[0] от ['a'][0] ? Преобразование нуля в строку идет в обоих случаях?
Что там происходит физически - хз. Каждый движок по-своему реализует соответствие спецификации.
Но многих операций в теории можно избежать с помощью всяких эвристических оптимизаций.
Например, движок может не определять у массива свойство length, если анализ семантического дерева показывает, что оно ни разу не используется.
А может не то что не определять никаких свойств, а даже и вообще не создавать "JS-объект" как таковой: если известно, что аксессоры используют только ключи целочисленного типа, то достаточно выделить голый индексированный список с простой интеграцией ссылок в инфраструктуру сборщика мусора. Накладные расходы будут близки к минимальным.
__________________

Гейзенберг, возможно, читал этот тред.

Последний раз редактировалось Дзен-трансгуманист, 20.02.2014 в 00:42.
Ответить с цитированием
  #38 (permalink)  
Старый 20.02.2014, 01:16
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от Deff
Cваял версию 2
Не очень то она отличается от уже предложенной

Отбросил медленные варианты:

(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() на большом массиве медленней чем с []. В файрфоксе наоборот...
__________________
В личку только с интересными предложениями

Последний раз редактировалось danik.js, 20.02.2014 в 01:19.
Ответить с цитированием
  #39 (permalink)  
Старый 20.02.2014, 01:24
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

danik.js,
У меня не запускается твой тест ни в одном из браузеров

Ответить с цитированием
  #40 (permalink)  
Старый 20.02.2014, 01:38
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Deff, консоль открой. От тебя не ожидал )))
Чтоб отработал вариант с Map() надо в chrome://flags включить harmony
В фф не знаю, у меня работает. Обнови фф или покопайся в настройках.
__________________
В личку только с интересными предложениями
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замена элементов массива элементами массива prostoix Javascript под браузер 4 24.10.2013 17:36
Вывод случайных элементов из массива в таблицу Narm0 Общие вопросы Javascript 10 06.08.2013 12:39
Определить количество отрицательных элементов массива Тип_1 Общие вопросы Javascript 3 25.06.2012 18:24
Сгенерировать 2 последовательности и узнать сколько в них одинаковых элементов Ирина Владимировна Общие вопросы Javascript 10 24.03.2012 18:18
поиск одинаковых значений элементов массива Valstor Общие вопросы Javascript 20 09.12.2011 18:56