Сделал тесты с массивами отсортированным и несортированным.
Для поиска в сортированном массиве использовал функцию, которую предлагал ранее, немного изменив ее.
Число элементов сделал 100_000, что бы не ждать часами.
const genKeys = (n) => {
const keys = []
while (n--) {
const nkey = Math.round(Math.random()*100_000);
const key = (''+nkey).padStart(6, '0');
keys.push(key)
}
return keys;
}
// Поиск значения val в отсортированном массиве arr
// возвращает {ind, has}
// has == true, если элемент есть и ind - индекс элемента
// has == false, если элемента нет и ind - индекс большего элемента
const findBinIndex =(arr, val) => {
if (arr.length == 0) return {ind: 0, has:false}
let nb=0, ne=arr.length-1;
if (val<=arr[0]) return {ind:0, has:val==arr[0]};
if (val > arr[ne]) return {ind: ne+1, has: false};
if (val == arr[ne]) return {ind: ne, has: true};
let index;
while (true) {
index = ((ne + nb) / 2) | 0;
if (arr[index] <= val)
nb = index;
else
ne = index;
if (ne - nb == 1) {
if (val<=arr[nb]) return {ind:nb,has:val==arr[nb]};
if (val > arr[ne]) return {ind:ne+1, has: false};
if (val == arr[ne]) return {ind:ne, has: true};
return {ind: ne, has:false};
}
}
}
const N = 100_000;
let t0;
// Генерация ключей для заполнения
const keys = genKeys(N);
const obj = {};
const set = new Set();
const arr = [];
const arrns = [];
let key;
// Проверка и добавление для Set
t0 = performance.now();
for (let i=0; i<N; i++) {
key = keys[i];
if (!set.has(key)) set.add(key);
}
const tsetset = performance.now() - t0;
// Проверка и добавление для объекта
t0 = performance.now();
for (let i=0; i<N; i++) {
key = keys[i];
if (!(key in obj)) obj[key] = true;
}
const tsetobj = performance.now() - t0;
// Проверка и добавление для массива
t0 = performance.now();
for (let i=0; i<N; i++) {
key = keys[i];
const res = findBinIndex(arr, key)
if (!res.has) arr.splice(res.ind, 0, key)
}
const tsetarr = performance.now() - t0;
// Проверка и добавление для несортированного массива
t0 = performance.now();
for (let i=0; i<N; i++) {
key = keys[i];
const ind = arrns.indexOf(key);
if (ind<0) arrns.push(key)
}
const tsetarrns = performance.now() - t0;
// Проверка и удаление для Set
t0 = performance.now();
for (let i=0; i<N; i++) {
key = keys[i];
if (set.has(key)) set.delete (key);
}
const tdelset = performance.now() - t0;
// Проверка и удаление для объекта
t0 = performance.now();
for (let i=0; i<N; i++) {
key = keys[i];
if (key in obj) delete obj[key];
}
const tdelobj = performance.now() - t0;
// Проверка и удаление для массива
t0 = performance.now();
for (let i=0; i<N; i++) {
key = keys[i];
const res = findBinIndex(arr, key);
if (res.has) arr.splice(res.ind, 1);
}
const tdelarr = performance.now() - t0;
// Проверка и удаление для несортированного массива
t0 = performance.now();
for (let i=0; i<N; i++) {
key = keys[i];
const ind = arrns.indexOf(key);
if (!ind>=0) arrns.splice(ind, 1);
}
const tdelarrns = performance.now() - t0;
console.log('Проверка и добавление для объекта', tsetobj.toFixed(0))
console.log('Проверка и добавление для Set', tsetset.toFixed(0))
console.log('Проверка и добавление для массива', tsetarr.toFixed(0))
console.log('Проверка и добавление для несорт. массива', tsetarrns.toFixed(0))
console.log('Проверка и удаление для объекта', tdelobj.toFixed(0))
console.log('Проверка и удаление для Set', tdelset.toFixed(0))
console.log('Проверка и удаление для массива', tdelarr.toFixed(0))
console.log('Проверка и удаление для несорт. массива', tdelarrns.toFixed(0))
Результаты такие
Цитата:
|
Проверка и добавление для объекта 62
Проверка и добавление для Set 23
Проверка и добавление для массива 1443
Проверка и добавление для несорт. массива 181184
Проверка и удаление для объекта 26
Проверка и удаление для Set 23
Проверка и удаление для массива 4620
Проверка и удаление для несорт. массива 28313
|
Какой то парадокс. Безумно долго идет заполнение неотсортированного массива. В разы дольше, чем удаление из него же. Не могу понять почему.