javascript-only test for cache sizes by testing latency at different sizes. works in safer mode.
function cache() {
const sizesKB = [16, 32, 64, 96, 128, 256, 512, 1024, 2048, 3072, 4096, 8192, 12288, 16384, 20480, 24576, 32768, 49152];
const results = [];
const unrollFactor = 8;
const ops = 8_000_000 / unrollFactor;
for (let i = 0; i < sizesKB.length; i++) {
const sizeKB = sizesKB[i];
const numElements = (sizeKB * 1024) / 4;
const data = new Uint32Array(numElements);
for (let j = 0; j < numElements; j++) {
data[j] = (j + 10007) % numElements;
}
let ptr = 0;
for (let k = 0; k < 100_000; k++) {
ptr = data[ptr];
}
let start = performance.now();
while (performance.now() === start) { }
start = performance.now();
for (let k = 0; k < ops; k++) {
ptr = data[ptr]; ptr = data[ptr]; ptr = data[ptr]; ptr = data[ptr];
ptr = data[ptr]; ptr = data[ptr]; ptr = data[ptr]; ptr = data[ptr];
}
const end = performance.now();
results.push({
Size: sizeKB >= 1024 ? (sizeKB / 1024) + "MB" : sizeKB + "KB",
"ns": Math.round((end - start) * 1_000_000 / (ops * unrollFactor))
});
}
console.table(results);
}
cache();