Разъяснения по оптимизации типов данных с одним конструктором в GHC - PullRequest
5 голосов
/ 27 июня 2019

Я читал о том, как оптимизировать мой код на Haskell, и наткнулся на заметку о Типах данных с одним конструктором в GHC .

Выдержка:

GHCлюбит типы данных с одним конструктором, такие как кортежи.Тип данных с одним конструктором может быть распакован, когда он передан строгой функции.Например, учитывая эту функцию:

f (x,y) = ...

Анализатор строгости GHC обнаружит, что f строгое в своем аргументе, и скомпилирует функцию следующим образом:

f z = case z of (x,y) -> f' x y
f' x y = ...

, где f называетсяОбертка, и F 'называется рабочим.Оболочка везде встроена, так что, например, если у вас был вызов f, подобный этому:

... f (3,4) ...

, это в итоге будет скомпилировано в

... f' 3 4 ...

и кортеж будет полностьюоптимизирован.

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

Является ли это альтернативой INLINE прагме?Должен ли я использовать оба?Только один?Один лучше?

1 Ответ

11 голосов
/ 27 июня 2019

Я действительно не понимаю, как это оптимизировать, когда кортеж все равно разворачивается.

Это оптимизация: кортеж распаковывается. Итак, программа, которая в конечном итоге запускается, никогда не содержит кортеж вообще, она просто содержит вызов функции с двумя аргументами.

Можно также выразить это более пессимистично: ab initio, кортежи по своей природе плохие для производительности. Это связано с тем, что для аргумента кортежа требуется указатель три : thunk для всего кортежа, thunk для элемента fst и thunk для элемента snd. Так что в принципе для производительности очень плохая идея обернуть ваши данные в кортежи. (Лучше поместить это в data структуры со строгими полями.) То есть, конечно, если вам действительно не нужна лень во всех этих местах.

Однако , и в этом суть цитаты, на практике, как правило, все еще нормально использовать кортежи в GHC, потому что обычно он может оптимизировать косвенное направление, если может доказать, что это не так. необходимо.

...