Я думаю, что причина того, что ваша мульти-методная реализация медленнее, может также быть связана с тем, что вы используете сокращение для отложенной последовательности (предоставляемой диапазоном) вместо цикла / повторения для возрастающего индекса, который используется в clojure.core. Попробуйте скопировать часть цикла реализации clojure.core / re-groups во второй метод определения и посмотрите, не увеличивает ли это производительность.
Трудно сказать, не увидев тестовый пример, но если в сопоставителе много групп, вы можете потратить гораздо больше времени на приведение групп к вектору, чем при отправке из нескольких методов. Однако, если групп немного, то отправка нескольких методов будет занимать более значительную часть затраченного времени. В любом случае, наличие одной и той же реализации устранит потенциальный фактор, влияющий на разницу во времени, и поможет вам лучше понять фактические издержки при отправке несколькими методами.
Другая вещь, которую вы могли бы рассмотреть, - это вероятность того, что замедление связано с отражением. Попробуйте установить * warn-on-отражением * в true и посмотреть, если он жалуется. Может быть, поможет другой стратегический тип подсказки.