Пытаясь расширить свой кругозор в области структур данных, я узнал о двух собственных структурах JavaScript, о которых никогда не слышал — Sets и Maps.
Почему я никогда не слышал о них? Может быть, потому что я полный профан? Или, может быть, они просто не так распространены? (мой хороший способ сказать «бесполезны»).
Чтобы выяснить это, я решил провести небольшой эксперимент и проверить время создания и получения каждого из четырех больших массивов — массивов, объектов, наборов и карт.
Вот что я сделал:
- Сначала я протестировал массивы — построение с помощью цикла for и получение с помощью метода indexOf (для наихудшего варианта элемента).
const myArray = []
function storeWithArray(array, itemToFind) {
const startTime = Date.now()
for (let i = 0; i < 10000000; i++) {
array.push(i)
}
const buildTime = Date.now()
console.log("Array Build Time: ", buildTime - startTime)
console.log(array.indexOf(itemToFind) === itemToFind)
const retrievalTime = Date.now()
console.log("Array Retrieval Time: ", retrievalTime - buildTime)
}
Затем я использовал построенный массив для тестирования трех других структур:
Sets
function storeWithSet(array, itemToFind) {
const startTime = Date.now()
const mySet = new Set();
array.forEach((item) => {
mySet.add(item)
})
const buildTime = Date.now()
console.log("Set Build Time: ", buildTime - startTime)
console.log(mySet.has(itemToFind))
const retrievalTime = Date.now()
console.log("Set Retrieval Time: ", retrievalTime - buildTime)
}
Объекты
function storeWithObject(array, itemToFind) {
const startTime = Date.now()
const myObject = new Object();
array.forEach((item) => {
myObject[item] = item;
})
const buildTime = Date.now()
console.log("Object Build Time: ", buildTime - startTime)
console.log(myObject[itemToFind] === itemToFind)
const retrievalTime = Date.now()
console.log("Object Retrieval Time: ", retrievalTime - buildTime)
}
Карты
function storeWithMap(array, itemToFind) {
const startTime = Date.now()
const myMap = new Map();
array.forEach((item) => {
myMap.set(item, item)
})
const buildTime = Date.now()
console.log("Map Build Time: ", buildTime - startTime)
console.log(myMap.get(itemToFind) === itemToFind)
const retrievalTime = Date.now()
console.log("Map Retrieval Time: ", retrievalTime - buildTime)
}
И время работы:
storeWithArray(myArray, 9999999)
storeWithSet(myArray, 9999999)
storeWithObject(myArray, 9999999)
storeWithMap(myArray, 9999999)
Вот результаты:
Неудивительно, что время поиска массива было самым долгим, но время сборки было намного короче, чем у наборов и карт!
Объекты, похоже, являются явным победителем с самым коротким временем сборки и незначительно большим временем извлечения, чем Карты и Наборы (иногда они даже выигрывают у них).
Таким образом, если вам нужно хранить и извлекать информацию, объекты — ваш лучший выбор.
Тогда для чего подходят карты и наборы?
Я знаю, что они обладают уникальными свойствами — они упорядочены, как массивы, могут предотвращать дублирование значений и т.д. Но какой случай использования оправдывает их очевидную неэффективность?