Помимо низкоуровневых оптимизаций, это зависит от размера хеш-таблиц и возможного диапазона значений ключей.
Если диапазон ключей не намного меньше размера, вы можетеБыстрее с векторами вместо хеш-таблиц.Если размер небольшой (менее 20-50), но большой диапазон (например, UUID), возможно, списки лучше подходят.
Если запись в эти хеш-таблицы не является узким местом, вы можете обернуть ваш хештаблицы с объектами, содержащими также некоторую вспомогательную структуру данных для сравнения ключей.Это может быть некоторый бит-вектор, отмечающий используемые ключи, или полный пользовательский хэш всех используемых ключей, или (если размер и диапазон действительно велики) что-то вроде фильтра Блума.
Распараллеливание может иметь смысл, если вашпроблема достаточно велика в некотором измерении, чтобы оправдать издержки: например, либо частота независимых сравнений очень высока, либо число ключей в хэш-таблице очень велико.
Один возможный низкий уровеньОптимизация заключается в использовании loop
вместо maphash
, который в большинстве случаев можно скомпилировать в гораздо более быстрый код:
(loop :for key1 :being :the :hash-keys :of ht1
:always (nth-value 1 (gethash key1 ht2)))