Плохая производительность fold
Наткнулся на старый тикет, в котором Travis Brown померял производительность вызова fold по сравнению с обычным паттерн-матчингом. Замеры он делал для cats.data.Validated
, но результаты актуальны и для аналогичных контейнеров (Either
, Option
). А результаты неутешительные — fold
медленнее заинлайненного паттерн-матчинга в четыре раза.
fold
для этих типов реализован тривиально и фактически принимает две функции, чтобы засунуть их в паттерн-матчинг:
Просадка производительности связана с тем, как в jvm реализованы лямбды: для каждой лямбды аллоцируется объект в куче. Соотвественно fold
только и делает, что аллоцирует лямбды для своих аргументов.
Что с этим делать? Да ничего. Если у вас есть горячий код с фолдами, то вы, скорее всего, уже давно всё заинлайнили. Если код холодный, то оверхед вы и не заметите.