2015-07-20 1 views
12

Я где-то читал, что совпадение шаблонов происходит во время выполнения, а не во время компиляции. (Я ищу источник, но не могу его найти в данный момент.) Это правда? И если да, то функции охраны в функциях имеют одинаковую производительность?Является ли образцовое сопоставление более совершенным, чем охранники?

Чтение это было удивительно для меня, потому что я думал, что GHC смог оптимизировать некоторые (возможно, не все) решения соответствия шаблону во время компиляции. Это вообще происходит?

Случай, например:

f 1 = 3 
f 2 = 4 

против

f' a | a == 1 = 3 
    | a == 2 = 4 

ли f и f' компилировать в том же количестве инструкций (например, в активной зоне и/или ниже)?

Является ли ситуация другой, если я сопоставляю шаблон с конструктором вместо значения? Например. если GHC видит, что функция из местоположения всегда вызывается с помощью одного конструктора, оптимизирует ли этот вызов таким образом, чтобы исключить проверку времени выполнения? И если да, можете ли вы привести мне пример, показывающий, что делает оптимизация?

В заключение

Что хорошо знать об этих двух подходов с точки зрения производительности?

Когда предпочтительнее производительность?

+4

Вы спрашиваете, как получить основной вывод от GHC или как использовать критерий? – jberryman

+1

Релевантно: [Haskell GHC: какая временная сложность совпадения шаблона с конструкторами N?] (Http://stackoverflow.com/q/9027384/2751851) – duplode

+0

Я бы склонен думать, что сопоставление шаблонов выполняется быстрее, учитывая что экземпляры 'Eq' обычно основаны на сопоставлении шаблонов в любом случае. – AJFarmar

ответ

14

Не обращайте внимания на образцы против охранников, вы также можете задать вопрос о if против case.

Соответствие шаблону является предпочтительным для проверки равенства. Проверка равновесия на самом деле не является естественным делом в Haskell. Boolean blindness - одна из проблем, но помимо этого полная проверка равенства часто просто невозможна. – например. бесконечные списки никогда не сравнятся!

Насколько эффективен прямой прямой сопоставление образцов, зависит от типа. В случае цифр не ожидайте большой разницы, так как эти шаблоны находятся под капотом с проверкой равенства.

Я вообще предпочитаю узоры –, потому что они только приятнее и могут быть более эффективными. Проверки равенства будут либо дорогими, либо, возможно, более дорогими, а просто неидиоматичны. Используйте только логическую оценку, когда вам нужно, иначе придерживайтесь шаблонов (которые могут быть также in guards)!

Смежные вопросы