чтение файлов значков SVG с диска по сравнению с кэшированием данных SVG? - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть приложение Electron, использующее d3, и оно использует множество маленьких (50 x 50 px) значков SVG - их может быть 100 или более, со множеством дубликатов.

Значки считываются с диска с помощью fs и возвращаются в мою процедуру создания d3. Пользователь может переключать значки, когда они редактируют свой проект. Они могли использовать одну или две иконки снова и снова или использовать любую из 50 иконок, доступных для их выбора.

Я думал, что я умен, и написал «менеджер иконок», который кэширует данные SVG. в массиве после того, как он прочитан fs, так что, если значок используется несколько раз, версия «в памяти» может быть возвращена вместо повторного чтения с диска.

Я написал код поверх год go и сегодня ему пришлось go решить проблему. Глядя на это сейчас, мне интересно, что все это просто глупо: то, что fs попадание на диск по сравнению с обходом массива, является бессмысленной и даже потенциально «отрицательной» оптимизацией - что с ростом числа элементов в массиве «стоимость» становится выше.

Я слишком много работаю здесь без причины?


const fs = require('fs');
const iconLib = [];

exports.getIcon = function (iconName, iconPath) {

    for (let i = 0; i < iconLib.length; i++) {
        if (iconLib[i].iconName == iconName) {
            return iconLib[i].iconData;
        }
    }

    if (fs.existsSync(iconPath)) {
        let data = fs.readFileSync(iconPath, 'utf8');
        iconLib.push({ iconName: iconName, iconData: data })
        return data;
    } else {
        // TODO return something useful
        return 0;
    }
};

1 Ответ

0 голосов
/ 14 апреля 2020

Вместо массива, который необходимо просматривать при каждом извлечении, как насчет использования встроенной в JavaScript Карта ?

Чтобы добавить значок на карту:

    const iconMap = new Map();

    function cacheIcon(iconName, iconData) {
      iconMap.set(iconName, iconData);
    }

Чтобы получить значок с карты:

    iconData = iconMap.get(iconName);
...