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.
Всем базы! 💪