Unknown - haskell-notes

Здесь есть возможность читать онлайн «Unknown - haskell-notes» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Жанр: Старинная литература, на английском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

haskell-notes: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «haskell-notes»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

haskell-notes — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «haskell-notes», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

памяти за нас. Стоит отметить оптимизацию -fexcess -precision, он может существенно ускорить програм-

мы, в которых много вычислений с Double. Но при этом вычисления могут потерять в точности, округление

становится непредсказуемым.

Прагма INLINE

Если мы посмотрим в исходный файл для модуля Prelude, то мы найдём такое определение для компо-

зиции функций:

-- | Function composition.

{-# INLINE (.) #-}

-- Make sure it has TWO args only on the left, so that it inlines

-- when applied to two functions, even if there is no final argument

( .)

::(b ->c) ->(a ->b) ->a ->c

( .) f g =\x ->f (g x)

Помимо знакомого нам определения и комментариев мы видим новую прагму INLINE. Она указывает

компилятору на то, что на этапе упрощения программы необходимо заменить вызов функции на её правую

часть. Этот процесс называют встраиванием функций. Замена будет произведена только в случае полного

применения функции, если синтаксическая арность (количество аргументов слева от знака равно) совпадает

с числом переданных в функцию аргументов. Поэтому для GHC есть существенная разница между определе-

ниями:

( .) f g =\x ->f (g x)

( .) f g x =f (g x)

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

щественно разбухнуть. GHC пользуется эвристическим алгоритмом при определении когда функцию стоит

встраивать, а когда – нет. По умолчанию GHC проводит встраивание только внутри модуля. Если мы компи-

лируем с флагом O, функции будут встраиваться между модулями. Для этого GHC сохраняет в интерфейсном

файле (с расширением .hi) не только типы функций, но и павые части достаточно кратких функций. Дли-

на функции определяется числом узлов в синтаксическом дереве кода её правой части. Директивой INLINE

мы приказываем GHC встроить функцию. Также есть более слабая версия этой прагмы – INELINABLE. Этой

прагмой мы рекомендуем произвести встраивание функции не смотря на её величину.

Задать порог величины функции для встраивания можно с помощью флага -funfolding -use -

threshold =16. Отметим, что если функция не является экспортируемой и используется лишь один раз,

то GHC втроит её в любом случае, поэтому стоит определять списки экспортируемых определений в шапке

модуля, иначе компилятор будет считать, что экспортируются все определения.

Прагма INLINEможет стоять в любом месте, где можно было бы объявить тип значения. Так например

можно указать компилятору встраивать методы класса:

Оптимизация программ | 173

instance Monad T where

{-# INLINE return #-}

return = ...

{-# INLINE (>>=) #-}

( >>=)

= ...

Встраивание значений может существенно ускорить программу. Но не стоит венчать каждую экспортиру-

емую функцию прагмой INLINE, возможно GHC встроит их автоматически. Посмотреть какие функции были

встроены можно по определениям, попавшим в файл .hi.

Например если мы скомпилируем такой код с флагом ddump -hi:

module Inline(f, g) where

g :: Int -> Int

g x =x +2

f :: Int -> Int

f x =g $g x

то среди прочих определений увидим:

ghc -c -ddump -hi -O Inline.hs

...

f :: GHC.Types.Int -> GHC.Types.Int

{- Arity: 1, HasNoCafRefs, Strictness: U(L)m,

Unfolding: InlineRule (1, True, False)

(\ x :: GHC.Types.Int ->

case x of wild { GHC.Types.I# x1 ->

GHC.Types.I# (GHC.Prim.+# (GHC.Prim.+# x1 2) 2) }) -}

...

В этом виде прочесть функцию не так просто. Ко всем именам добавлены имена модулей. Приведём

вывод к более простому виду с помощью флага dsuppress -all:

ghc -c -ddump -hi -dsuppress -all -O Inline.hs

...

f :: Int -> Int

{- Arity: 1, HasNoCafRefs, Strictness: U(L)m,

Unfolding: InlineRule (1, True, False)

(\ x :: Int -> case x of wild { I# x1 -> I# (+# (+# x1 2) 2) }) -}

...

Мы видим, что все вызовы функции g были заменены. Если вы всё же подозреваете, что GHC не справ-

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

INLINE, но при этом лучше узнать, привело ли это к росту производительности, проверить с помощью про-

филирования.

Отметим также прагму NOINLINEс её помощью мы можем запретить встраивание функции. Эта праг-

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «haskell-notes»

Представляем Вашему вниманию похожие книги на «haskell-notes» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «haskell-notes»

Обсуждение, отзывы о книге «haskell-notes» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x