Возможна ли потеря кэша в NodeJS и как ее получить? - PullRequest
0 голосов
/ 30 октября 2019

Из Википедия , Отсутствие кэша - неудачная попытка чтения или записи фрагмента данных в кэше, что приводит к доступу к основной памяти с гораздо большей задержкой.

enter image description here

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

/* Array.prototype.flat polyfill */
Array.prototype.flat = function() {
    this.reduce((a, v) => Array.isArray(v) ? a.concat(v.flat()) : a.concat(v), []);
};
/* Cache test */
const len = 100;
const generateArr = (len) =>  {
    const mat = [...new Array(len)].map(() => 
        [...new Array(len)].map(() => Math.round(Math.random() * 10))
    );
    return new Uint8Array(mat.flat(Infinity))
};
const arr = generateArr(len)
/* {1, 2, 3, 4, 5, 6, 7, 8, 9, n} */
const testFriendly = () => {
    let total=0;    
    for (let x=0;x!=len;x+=10) {
        for (let y=0;y!=10;y++) {
            total+=arr[x+y];
        }
    }
};
/* {0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 1, 11, 12, n}*/
const testUnfriendly = () => {
    let total=0;
    for (let y=0;y!=10;y++) {
        for (let x=0;x!=len;x+=10) {
            total+=arr[x+y];
        }
    }
};
const test = () => {
    console.time("Cache-friendly");
    for (let i=0; i!=7000; i++) {
        testFriendly();
    }
    console.timeEnd("Cache-friendly");
    console.time("Cache-unfriendly");
    for (let i=0; i!=7000; i++) {
        testUnfriendly();
    }
    console.timeEnd("Cache-unfriendly");
};
test()
test()
test()
test()

После завершения JIT дружественный тест выполняется быстрее, но не всегда. Это ошибка кэша?

enter image description here

Но может ли прикладной программист получить ошибку кэша на платформе NodeJS? Существуют ли какие-либо анти-паттерны, чтобы гарантировать отсутствие кеша и предотвратить подобное в рабочем коде?

1 Ответ

0 голосов
/ 30 октября 2019

о каких данных мы говорим?

В основном все данные .

Существует три места, где данные могут храниться (записываться, считываться):

(1) Регистрируется непосредственно на процессоре [несколько байтов].

(2) ОЗУ (с кэшем перед ним) [несколько гигабайт / террабайт]

(3) В / В (жесткие диски, твердотельные накопители, сетевые адаптеры) [неограниченно]

Поскольку вы не можете получить доступ к (1) и (3) напрямую, все ваши данные в основном попадают в ОЗУ.

Возможна ли потеря кеша в NodeJS и как ее получить?

Конечно. В оптимальном случае, если все ваши данные, с которыми вы работаете, кэшируются, и используется весь кэшированный объем, несколько килобайт сохраняются в L1, несколько сотен килобайт сохраняются в L2, а несколько MB хранятся в L3. Поэтому, если вы работаете с большим количеством данных, чем вмещается в эти кэши, пропадание кэша обязательно произойдет (тем не менее, они, скорее всего, произойдут).

После завершения JIT дружественный тест выполняется быстрее, но не всегда. Это ошибка кэша?

Хорошо, давайте посмотрим на стек, с которым вы работаете:

JavaScript <- you are here
/* gets run by */
V8 / NodeJS <- optimizations do happen
/* is written in */
C++ <- optimizations do happen, the other question is at this level
/* gets compiled to */
bytecode <- optimizations do happen
/* gets finally run on */
The Processor <- here the caches come into play

Другими словами: в отличие от C ++ вопрос, в NodeJS есть другой уровень оптимизации между ними. Этот уровень может вводить другие кэши, может изменять способ представления данных в памяти или выполнять другие оптимизации. Вы можете проанализировать байт-код , который выполняет V8, и оптимизировать для этого ... но в следующей версии V8 может появиться другая оптимизация, которая сделает ваши "оптимизации" устаревшими.

Но может ли прикладной программист получить промах кеша на платформе NodeJS?

Конечно. Где-то под капотом, очень вероятно, очень часто. Но ... Вы можете что-нибудь с этим сделать? Нет, не совсем. Команда V8 или разработчики компилятора C ++ могут, вы не можете, на самом деле.

Существуют ли какие-либо анти-паттерны, чтобы гарантировать отсутствие кеша и предотвратить схожие в рабочем коде?

Да, не пишите сумасшедший код.

Оценки взяты из блога Ника Крейвера , я настоятельно рекомендую прочитать это:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...