Нет способа повлиять на то, как движок распределяет память, поэтому, что бы вы ни делали, вы не можете гарантировать , что используемый вами прием работает на каждом движке или даже на другой версии того же движка.
Однако в JS есть типизированные массивы, это единственные структуры данных с фиксированным размером. С их помощью вы можете реализовать свой собственный hashmap с фиксированным размером.
Очень наивная реализация немного быстрее ² при вставке, не уверен, как она ведет себя при чтениях и других (также он может хранить только 8-битные целые числа> 0):
function FixedMap(size) {
const keys = new Uint8Array(size),
values = new Uint8Array(size);
return {
get(key) {
let pos = key % size;
while(keys[pos] !== key) {
if(keys[pos] % size !== key % size)
return undefined;
pos = (pos + 1) % size;
}
return values[pos];
},
set(key, value) {
let pos = key % size;
while(key[pos] && key[pos] !== key) pos = (pos + 1) % size;
keys[pos] = value;
values[pos] = value;
}
};
}
console.time("native");
const map = new Map();
for(let i = 0; i < 10000; i++)
map.set(i, Math.floor(Math.random() * 1000));
console.timeEnd("native");
console.time("self");
const fixedMap = FixedMap(10000);
for(let i = 0; i < 10000; i++)
fixedMap.set(i, Math.floor(Math.random() * 1000));
console.timeEnd("self");
² Маркетинг сказал бы Это на 20% быстрее! и я бы сказал Это до На 2 мс быстрее, и я потратил на это более 10 минут ...