🔥 И вот тут как раз на помощь спешат enum и их брат const enum. Но, сразу скажу, чтобы данный способ работал мы должны заранее знать возможные ключи нашей таблицы.



const enum Keys {

key1,

key2,

key3,

length

}



const cache = new Array(Keys.length).fill(null);



function exec(key: Keys) {

if (cache[key] != null) {

return cache[key];

}



/// ...



cache[key] = result;

}



exec(Keys.key1);

exec(Keys.key2);




И все! Нам даже не сильно пришлось менять код! Мы просто определили множество возможных ключей, вместо хеш-таблицы создали массив сразу нужной длины (чтобы память лишний раз не гонять на росте и гарантировать отсутствие дырок) и заполнили его нулями (null это указатель состоящий из одних нулей). А дальше мы работаем с массивом как с ассоциативным массивом с помощью enum. А так как он const, то фактически в Runtime у нас сразу идут индексы нужных элементов. Никаких рассчетов хеша, коллизий, никаких перехеширований. В моем случае вместо сотни миллисекунд я получил в районе 20-30.



Кто знаком со структурами данных "структура" или "кортеж" может заметить определенное сходство. У нас есть ассоциативный доступ, но "расти" такой массив не может, а все его ключи известны заранее.



Все так, но пока нативных кортежей в JS не завезли (есть в планах), а уже сейчас мы можем это удобно использовать с помощью enum TS. Внедрить легко, а профит может быть отличным.



Разумеется я не призываю всех срочно бежать проверять свой код. Как я писал недавно: если не болит, то и не надо лечить. Но так вышло, что у меня болело и используя этот трюк я добился качественного улучшения. Так что имейте в виду и не спешите выбрасывать enum.



Всем базы! 💪