Есть ли существенная разница в производительности между запуском `объяснение-данных` и` допустимым? ` - PullRequest
0 голосов
/ 15 апреля 2020

Есть ли существенная разница в производительности между explain-data и valid?.

Например, у меня есть этот код

(let [is-valid? (spec/valid? ::SpecitySpec the-map)
      _ (when-not is-valid?
          (throw (ex-info "the-map doesn't match spec"
                          {:explain-data (spec/explain-data ::SpecitySpec the-map)})))])

В случае счастливого пути, тогда он будет работать только valid?.

Хотя, для краткости, я бы предпочел:

(let [explain-data (spec/explain-data ::SpecitySpec the-map)
      _ (when explain-data
          (throw (ex-info "the-map doesn't match spec"
                          {:explain-data explain-data}))

Однако, если производительность увеличится до explain-data, то я думаю, что Первый пример будет лучшим.

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Вы можете ответить на свой вопрос!

Просто используйте clojure.core/time для измерения скорости выполнения двух опций. Если вам действительно нужна вторая версия, вы можете легко написать макрос для преобразования кода из # 2 в код для # 1. Хорошее имя может быть validate-spec или похожее.

Вам также может быть интересен этот вопрос о написании макросов .

0 голосов
/ 16 апреля 2020

Я разместил это на канале Clojurians Slack # clojure-spe c и получил ответ от Алекса Миллера . Вот что он сказал:

Они оба в конечном счете вызывают одну и ту же функцию, поэтому я ожидаю, что perf сейчас будет очень похожим. мы считали быстрый путь отдельным действительным? путь в spe c 2, хотя, и я ожидаю, что это будет более быстрый вариант.

Большие различия в том, что а) с допустимым ?, вы можете быстро потерпеть неудачу и б) с объяснением, вы должны отслеживать много дополнительной информации и накапливаю ее для отчетности

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...