Рубріки: HighloadТеория

JavaScript-кэширование

Игорь Грегорченко

Возникают ситуации, когда нам требуется довольно часто дергать какой-либо DOM элемент (например, с помощью querySelector). Но к сожалению, этот метод довольно прожорливый и из-за него очень сильно падает производительность. Или, например, нужно часто делать тяжелые запросы на сервер в рамках одной сессии. Либо же пользоваться функциями, которые долго что-то считают.

К счастью, мы можем воспользоваться возможностями JavaScript’a и написать функцию cache, способную кэшировать результаты работы других методов, чтобы, в случае надобности, повторно не вызывать эти самые методы:

function cache(key, value) 
{
    if (typeof value == 'undefined') {
        return cache[key];
    }
    cache[key] = value;
}

Теперь на примерах рассмотрим как будет вести себя написанная выше функция cache.

Пример 1. Кэширование querySelector

// _io_q - обертка под querySelector, сохраняющая данные в кэш
_io_q = function(selector)
{
    if (!cache(selector)) { 
        cache(selector, document.querySelector(selector));
    }
    return cache(selector);
}

Теперь посмотрим на скорость работы _io_q и querySelector:

console.time('regular querySelector');
for (var i = 0; i < 1000000; i++) {
    document.querySelector('h1');
}
console.timeEnd('regular querySelector'); // regular querySelector: 100.6123046875ms


console.time('cached _io_q');
for (var i = 0; i < 1000000; i++) {
    _io_q('h1');
}
console.timeEnd('cached _io_q'); // cached _io_q: 5.77392578125ms

Пример 2. Кэширование запросов с сервера

Напишем функцию, которая отправляет очень тяжелый запрос на сервер:

function longRequestToServer(params)
{
    var key = params.endpoint + '_' + params.value;
    if (!cache(key)) {
        var result = 0;
        for (var i = 0; i < 999999999; i++) {
            result++;
        }
        cache(key, result);
    }
    return cache(key);
}

Посмотрим как будет вести себя функция:

console.time('first run');
longRequestToServer({
    endpoint : '/loadExample', 
    value : 10}
);
console.timeEnd('first run'); // first run: 1012.068115234375ms

console.time('second run');
longRequestToServer({
    endpoint : '/loadExample', 
    value : 10}
);
console.timeEnd('second run'); // second run: 1.31884765625ms

console.time('other request');
longRequestToServer({
    endpoint : '/loadSomeOtherData', 
    value : 15
});
console.timeEnd('other request'); // other request: 1033.783203125ms

TL;DR

Используя возможности JavaScript’a можно эффективно кэшировать данные, выигрывая в производительности. Но будьте аккуратны, ведь выигрывая в производительности можно потерять на ресурсах и по неосторожности добиться утечки памяти.

Этот текст был написан несколько лет назад. С тех пор упомянутые здесь инструменты и софт могли получить обновления. Пожалуйста, проверяйте их актуальность.

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023