Является ли образцовое сопоставление более результативным, чем защита?
В последнее время я читал, что совпадение шаблонов происходит во время выполнения, а не во время компиляции. (Я ищу источник, но не могу его найти в данный момент.) Это правда? И если да, то функции охраны в функциях имеют одинаковую производительность?
Чтение этого было неожиданным для меня, потому что я думал, что GHC смог оптимизировать некоторые (возможно, не все) решения соответствия шаблонов во время компиляции. Это вообще происходит?
Случай, например:
f 1 = 3
f 2 = 4
против
f' a | a == 1 = 3
| a == 2 = 4
Do f
и f'
скомпилировать с тем же количеством инструкций (например, в Core и/или ниже)?
Является ли ситуация другой, если я сопоставляю шаблон с конструктором вместо значения? Например. если GHC видит, что функция из местоположения всегда вызывается с помощью одного конструктора, оптимизирует ли этот вызов таким образом, чтобы исключить проверку времени выполнения? И если да, можете ли вы привести пример, показывающий, что делает оптимизация?
В заключение
Что хорошо знать об этих двух подходах с точки зрения производительности?
Когда предпочтительнее производительность?
Ответы
Ответ 1
Не обращайте внимания на шаблоны против охранников, вы можете также спросить о if
vs. case
.
Сравнение шаблонов предпочтительнее проверок равенства. Проверка равновесия на самом деле не является естественным делом в Haskell. Логическая слепота - одна из проблем, но, кроме того, полная проверка равенства часто просто невозможна – например бесконечные списки никогда не сравнится с равными!
Насколько эффективнее непосредственное сопоставление шаблонов, зависит от типа. В случае цифр не ожидайте большой разницы, поскольку эти шаблоны находятся под капотом, реализованным с проверками равенства.
Я обычно предпочитаю шаблоны – потому что они просто приятнее и могут быть более эффективными. Проверки равенства будут либо дорогими, либо, возможно, более дорогими, а просто неидиоматичны. Используйте только логическую оценку, когда вам нужно, в противном случае придерживайтесь шаблонов (которые могут быть в гвардии тоже!)