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

Сообщение от Deff
создадим тест сравнения
Ну что ж, давай!

/**
 * @author danik.js
 **/
function test1() {
    var array = [1, 2, 1, 10, 5, 3, 4, 40, 50];
    var result = [];
    for (var i = 0; i < array.length; i++) {
        var item = array[i];
        if (array.indexOf(item, i + 1) === -1 && (i === 0 || array.lastIndexOf(item, i - 1) === -1))
            result.push(item);
    }
    return result;
}

/**
 * @author Deff
 **/
function test2() {
    var array = [1, 2, 1, 10, 5, 3, 4, 40, 50];
    var bound = ',';
    var tststr = bound + array.join(bound+bound) + bound;
    var result = [];
     for (var i = 0; i < array.length; i++) {
        var item = array[i];
        var t = bound +item + bound;
        if (tststr.indexOf(t) === tststr.lastIndexOf(t))
            result.push(item);
     }
    return result;
}

/**
 * @author рони
 **/
function test3() {
    var array = [1, 2, 1, 10, 5, 3, 4, 40, 50];
    var result = [];
    array.sort(function (a, b) {
        return a - b;
    });
    for (var i = 0; i < array.length; i++) {
        var item = array[i];
        if (item != array[i - 1] && array[i + 1] != item)
            result.push(item);
    }
    return result;
}



/**
 * @author Дзен-трансгуманист (danik.js edition)
 **/
function test4(){
    var array = [1, 2, 1, 10, 5, 3, 4, 40, 50];
    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 BallsShaped
 **/
function test6(){
    var array = [1, 2, 1, 10, 5, 3, 4, 40, 50];
    var result = [];
    for (var i = 0; i < array.length; i++) {
        var item = array[i];
        if (array.indexOf(item) == array.lastIndexOf(item))
            result.push(item);
    }
    return result;
}

/**
 * @author Дзен-трансгуманист
 **/
function test5(){
  var array = [1, 2, 1, 10, 5, 3, 4, 40, 50];
  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 ); return;
      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('danik.js');
for (var i = 0; i < 1000000; i++)
    test1();
console.timeEnd('danik.js')



console.time('Deff');
for (var i = 0; i < 1000000; i++)
    test2();
console.timeEnd('Deff')



console.time('рони');
for (var i = 0; i < 1000000; i++)
    test3();
console.timeEnd('рони')

console.time('Дзен-трансгуманист (danik.js edition)');
for (var i = 0; i < 1000000; i++)
    test4();
console.timeEnd('Дзен-трансгуманист (danik.js edition)')

console.time('BallsShaped');
for (var i = 0; i < 1000000; i++)
    test6();
console.timeEnd('BallsShaped')

console.time('Дзен-трансгуманист');
for (var i = 0; i < 1000000; i++)
    test5();
console.timeEnd('Дзен-трансгуманист')


Мои результаты в хроме:
Код:
danik.js: 725.000ms
Deff: 5175.000ms
рони: 1448.000ms
Хорошо бы конечно генерить рандомные массивы разного размера, но как-то лень мне...
Думаю на больших массивах вариант рони окажется быстрей.
__________________
В личку только с интересными предложениями

Последний раз редактировалось danik.js, 19.02.2014 в 23:42.
Ответить с цитированием