Javascript NodeJS中是否可能出现缓存未命中以及如何获得它?

Javascript NodeJS中是否可能出现缓存未命中以及如何获得它?,javascript,node.js,algorithm,optimization,ecmascript-6,Javascript,Node.js,Algorithm,Optimization,Ecmascript 6,从中,缓存未命中是指在缓存中读取或写入一段数据的尝试失败,这会导致主存访问延迟更长 然而,我不明白我们谈论的是什么样的数据,以及如何综合再现这些数据。在此基础上,通过调整算法进行缓存优化,以避免访问时的数据碎片 /* Array.prototype.flat polyfill */ Array.prototype.flat = function() { this.reduce((a, v) => Array.isArray(v) ? a.concat(v.flat()) : a.c

从中,缓存未命中是指在缓存中读取或写入一段数据的尝试失败,这会导致主存访问延迟更长

然而,我不明白我们谈论的是什么样的数据,以及如何综合再现这些数据。在此基础上,通过调整算法进行缓存优化,以避免访问时的数据碎片

/* 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完成后,友好测试运行得更快,但并不总是如此。这是缓存未命中吗

但是,应用程序程序员能否在NodeJS平台上获得缓存丢失?是否存在任何反模式以保证缓存未命中并防止生产代码中出现类似情况

我们谈论的是什么样的数据

基本上所有的数据

数据可以存储在三个位置,即写入位置和读取位置:

1直接在处理器上注册[几个字节]

2个RAM,前面有缓存[几千兆/兆字节]

3个I/O硬盘、SSD、网络适配器[无限制]

由于无法直接访问1和3,因此所有数据基本上都会存储在RAM中

NodeJS中是否可能出现缓存未命中以及如何获得它

当然。在最佳情况下,如果您处理的所有数据都被缓存,并且整个缓存都被利用,那么一些kB存储在L1中,数百kB存储在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
P> >换句话说,不像C++问题,在NodeJS中有另一个级别的优化。该级别可能会引入其他缓存,可能会更改数据在内存中的表示方式,或者进行其他优化。您可以分析V8执行的字节码,并为此进行优化。。但是下一个V8版本可能会引入另一个优化,这会使您的优化过时

但是,应用程序程序员能否在NodeJS平台上获得缓存丢失

当然。在引擎盖下的某个地方,很可能,经常。但是你能做些什么吗?不,不是真的。V8团队或C++编译器实现者可以,你不能,真的。p> 是否存在任何反模式以保证缓存未命中并防止生产代码中出现类似情况

是的,好吧,不要写疯狂的代码


这些估计来自,我强烈建议阅读:

这其实不是你应该关心的事情。这在很大程度上取决于处理器和环境,这是NodeJS/V8团队的问题。作为一名JS开发人员,我假设引擎在尽可能多地利用L缓存方面做得最好。你能运行这些测试并平均结果吗?也就是说,运行这1000次,将时间相加,然后除以1000?