Компилятор GHC достаточно хорошо оптимизирует, когда код свален в одну кучу в одном модуле. Исполняется быстро, но с таким кодом работать неудобно. Так в одной куче у меня код долго и оставался, пока сегодня не попробовал прагму компилятора INLINE, которая подобна конструкции inline в C++.
Без этой прагмы после разбиения кода на модули, некоторые тесты стали отрабатывать медленнее в 3-4 раза на счетных задачах. Тогда я прогнал один из тестов через профайлер, и затем добавил прагму самой долгоисполняющейся функции. Я с самого начала догадывался, что эта за функции, а профайлер лишь подтвердил мое предположение.
Так вот, чудесная новость состоит в том, что прежняя скорость вернулась, какой она была до разбиения программы на модули. Другими словами, некоторые вещи ускорились в 3-4 раза.
Без этой прагмы после разбиения кода на модули, некоторые тесты стали отрабатывать медленнее в 3-4 раза на счетных задачах. Тогда я прогнал один из тестов через профайлер, и затем добавил прагму самой долгоисполняющейся функции. Я с самого начала догадывался, что эта за функции, а профайлер лишь подтвердил мое предположение.
Так вот, чудесная новость состоит в том, что прежняя скорость вернулась, какой она была до разбиения программы на модули. Другими словами, некоторые вещи ускорились в 3-4 раза.
Не знаю, может, у вас действительно какой-то баг проявился… Насколько я знаю, ghc не делает inlining между модулями ровно в тех случаях, когда у модулей не указаны списки экспорта. Впрочем, могу и ошибаться…
ОтветитьУдалитьСписки экспорта везде присутствуют. Меня удивило, что вынос только одной функции в отдельный модуль может так влиять на скорость. Скорее не баг, а просто эвристики такие.
ОтветитьУдалитьЭто какой GHC? 6.12.x? В 7.0.x в этой области все должно быть сильно лучше (и почти с нуля переделано)
ОтветитьУдалитьGHC 7.0.3 (linux x64 и linux x86).
ОтветитьУдалить