но даже если токо биться о память таблица будет работать быстрее дерева, хотя критерион может этого и не увидеть пушто он все сборки мусора выкинет
Читать полностью…Вот для сравнения что было в 0.1.1.4, там хешмапа еще хорошо держалась. (Там приходится заменить VH.lookup' на fromMaybe 0 <$> VH.lookup, потому что первое внезапно аллоцирует)
Читать полностью…откровенно говоря, до бодигримовских улучшений превосходство вхт над коллинзовской либой на бокснутых элементах - это тоже загадка
одна из коллинзовских таблиц фактически то же самое что и вхт
не удивлюсь, если там у него какая-то простая проблема типа инлайнабл вместо инлайн и коллинзовскую таблицу можно было починить не такими уж серьезными усилиями, просто ни у кого руки не дошли
Ну я не обязательно про полные коллизии когда хеши совпали, а про "hash mod
size" коллизии
Ну я ж не говорю что v-h плохи, просто делать вывод что очень хороши на основании только этого бенча имхо ошибочно. Если агдисты поменяли и у них на реальном коде хорошо -- то и прекрасно
Читать полностью…Нет; доберусь до компа попробую свой откопать. (И тут не то чтобы прямо жесткие требования, этот бенчмарк что-то то меряет, просто кмк реальные юз кейсы это не особо покрывает)
Читать полностью…Есть stan. Ничего за него не скажу так как не пользуюсь. Есть альтернативные Prelude без частичных функций. Пользуюсь Universum. Норм.
Читать полностью…вылезание из кеша процессора прост превращает бенчмарк таблицы в бенчмарк памяти, на результаты которого довольно сложно повлиять меняя че-то в имплементации таблицы
Читать полностью…И вот разница между последовательными и рандомными ключами и поиском в порядке вставки и случайном. Это все vector-hashtables unboxed (0.1.2.0), но разные данные.
На небольших размерах разница небольшая, вероятно в бранч предикторе — при последовательных ключах разницы в порядке поиска нет (все в кешах; любой поиск завершается после ровно одной итерации пробинга), при рандомных ключах поиск в рандомном порядке не дает бранч предиктору выучить паттерн пробинга.
На средних размерах все кроме seq/unshuffled начинает страдать, вероятно потому что приходится ходить все в более далекие кеши, хардварный префетчинг ни с чем кроме seq/unshuffled (где доступ последовательный) не справляется.
На больших размерах ходить при кешмисах приходится уже в память, поэтому разница становится огромной, 40+ (!!!) раз между seq/unshuffled и random/shuffled на миллионах элементов (на моем железе, это все по идее должно сильно зависеть от памяти и кешей)
(https://gist.github.com/aadaa-fgtaa/12ad7c5828cdf00b9734d0d0b035b8e7)
Так, вот моя попытка в более-менее нормальный бенчмарк: https://gist.github.com/aadaa-fgtaa/114620ab45c69a042f9996a6e7c4cf8a. И vector-hashtables == 0.1.2.0 наконец-то обходит всю иммутабельщину даже на крошечных размерах на этом бенче 🎉
Читать полностью…неправда, у него слишком длинное определение. Правильный ответ: owl
— у него лучшее соотношение размер/прикольность
да с коллизиями-то понятно, что плохо будет. но емнип в этом апексе выше ключи будут такие же, 1,2,3...
Читать полностью…Бенчмарк в vector-hashtables у вас кстати имхо очень сомнительный, если я правильно смотрю (я с телефона, мог что-то проглядеть):
- Ключи 1..n, hash @Int = id, поэтому вообще нет коллизий
- Ключи 1..n именно в этом порядке. hash @Int = id, поэтому доступ к buckets происходит строго последовательный, что весьма cache-friendly
- Поиск идёт в том же порядке что и вставка (то есть аллокация поэтому Entry), поэтому доступ к fhashCode, fkey и fvalue строго последовательный, опять же cache-friendly
- (это сейчас не влияет потому что коллизий нет, но для полноты) поиск/вставка всегда одинаковых ключей в одинаковом порядке, на не слишком больших размерах бранч предиктор должен между итерациями бенча выучить probe sequences, то есть не миспредиктить в этой ли ентри ключ или нужно искать дальше
Это наверное не полностью нереалистичный кейс, но все-таки я думаю что в большинстве реальных юз кейсов хотя бы что-то из этого не выполняется
Но тоже иногда порет, но его хотя бы настроить можно. Stan вообще без руля рулит..
Читать полностью…