Тестирую функцию 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