Показать сообщение отдельно
  #1169 (permalink)  
Старый 13.06.2015, 21:35
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Array::contains()
Тестирую функцию Array.prototype.contains2() с двунаправленным поиском, что теоретически должно увеличить вероятность/скорость поиска на всем пространстве значений.

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

/**
 * @param {*} any
 * @returns {Boolean}
 */
// TODO не находит NaN
Array.prototype.contains1 = function(any) {
    return this.indexOf(any) !== -1;
};

/**
 * @param {*} any
 * @returns {Boolean}
 */
// TODO не находит NaN
Array.prototype.contains2 = function(any) {
    var array = this;
    var l = array.length;
    if (l === 0) return false;
    for(var i = 0, j = l - 1; i <= j; i++, j--) {
        if (array[i] === any) return true;
        if (array[j] === any) return true;
    }
    return false;
};


// -------------------------------------

var NEEDLE = {};
var DATA = createDataSet();
console.log('data set was created');
//console.log(DATA);

test(function(array) {
    array.contains1(NEEDLE);
}, 'contains1');

test(function(array) {
    array.contains2(NEEDLE);
}, 'contains2');



function test(cb, msg) {
    var startTimeStamp = Date.now();
    console.log('start::' + msg);
    for(var i = 0, a = DATA, l = a.length; i < l; i++) {
        cb(a[i]);
    }
    var endTimeStamp = Date.now();
    console.log(endTimeStamp - startTimeStamp, msg);
    console.log('end::' + msg);
}


function createDataSet() {
    var EXPONENT = 6; // 1
    var data = [];

    for(var i = 0; i < 10; i++) {
        var array = range(0, Math.pow(10, EXPONENT));
        var needleIndex = Math.pow(10, EXPONENT - 1) * i;
        array[needleIndex] = NEEDLE;
        data.push(array);
    }
    data.push(range(0 ,Math.pow(10, EXPONENT)));

    return data;

    // ----------------------

    function range(from_, to_) {
        for(var a = [], j = from_; j < to_; j++) {
            a[j] = j;
        }
        return a;
    }
}


Windows7 x64

Chrome (last)
115 "contains1"
80 "contains2"

Firefox (last)
23 "contains1"
27 "contains2"

IE 10
139contains1
90contains2
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием