【发布时间】:2019-10-30 18:45:33
【问题描述】:
来自Wikipedia,缓存未命中是在缓存中读取或写入一段数据的失败尝试,这会导致延迟更长的主内存访问。
但是,我不明白我们在谈论什么样的数据以及如何综合再现这些数据。根据this的回答,通过调整算法进行缓存优化,避免访问时产生数据碎片。
/* 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 平台上获得缓存未命中吗?是否有任何反模式来保证缓存未命中并防止生产代码中出现类似情况?
【问题讨论】:
-
这不是你真正应该关心的事情。这个高度依赖处理器(环境),是NodeJS/V8团队的问题。作为一名 JS 开发人员,我假设引擎在尽可能多地利用 L 缓存方面做得最好。
-
你能运行这些测试并平均结果吗? IE。运行这 1000 次,将时间相加,然后除以 1000?
标签: javascript node.js algorithm optimization ecmascript-6