суббота, 10 сентября 2011 г.

Ускоряющий инлайнинг

Компилятор GHC достаточно хорошо оптимизирует, когда код свален в одну кучу в одном модуле. Исполняется быстро, но с таким кодом работать неудобно. Так в одной куче у меня код долго и оставался, пока сегодня не попробовал прагму компилятора INLINE, которая подобна конструкции inline в C++.

Без этой прагмы после разбиения кода на модули, некоторые тесты стали отрабатывать медленнее в 3-4 раза на счетных задачах. Тогда я прогнал один из тестов через профайлер, и затем добавил прагму самой долгоисполняющейся функции. Я с самого начала догадывался, что эта за функции, а профайлер лишь подтвердил мое предположение.

Так вот, чудесная новость состоит в том, что прежняя скорость вернулась, какой она была до разбиения программы на модули. Другими словами, некоторые вещи ускорились в 3-4 раза.

4 комментария:

  1. Не знаю, может, у вас действительно какой-то баг проявился… Насколько я знаю, ghc не делает inlining между модулями ровно в тех случаях, когда у модулей не указаны списки экспорта. Впрочем, могу и ошибаться…

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

    ОтветитьУдалить
  3. Это какой GHC? 6.12.x? В 7.0.x в этой области все должно быть сильно лучше (и почти с нуля переделано)

    ОтветитьУдалить