Какая структура данных лучше всего подходит для кэширования? Эксперимент 🧪

Пытаясь расширить свой кругозор в области структур данных, я узнал о двух собственных структурах JavaScript, о которых никогда не слышал — Sets и Maps.

Почему я никогда не слышал о них? Может быть, потому что я полный профан? Или, может быть, они просто не так распространены? (мой хороший способ сказать «бесполезны»).

Чтобы выяснить это, я решил провести небольшой эксперимент и проверить время создания и получения каждого из четырех больших массивов — массивов, объектов, наборов и карт.

Вот что я сделал:

  1. Сначала я протестировал массивы — построение с помощью цикла 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)
Войти в полноэкранный режим Выйти из полноэкранного режима

Вот результаты:

Неудивительно, что время поиска массива было самым долгим, но время сборки было намного короче, чем у наборов и карт!

Объекты, похоже, являются явным победителем с самым коротким временем сборки и незначительно большим временем извлечения, чем Карты и Наборы (иногда они даже выигрывают у них).

Таким образом, если вам нужно хранить и извлекать информацию, объекты — ваш лучший выбор.

Тогда для чего подходят карты и наборы?
Я знаю, что они обладают уникальными свойствами — они упорядочены, как массивы, могут предотвращать дублирование значений и т.д. Но какой случай использования оправдывает их очевидную неэффективность?

Оцените статью
devanswers.ru
Добавить комментарий