Ускорьте runhaskell

У меня есть небольшая тестовая среда. Он выполняет цикл, который выполняет следующие действия:

  1. Создает небольшой исходный файл Haskell.

  2. Выполните это с помощью runhaskell . Программа генерирует различные файлы на диске.

  3. Обработать только что сгенерированные файлы на диске.

Это происходит несколько десятков раз. Оказывается, runhaskell занимает большую часть времени выполнения программы.

С одной стороны, тот факт, что runhaskell удается загрузить файл с диска, разметить его, проанализировать, выполнить анализ зависимостей, загрузить с диска еще 20 КБ текста, разметить и проанализировать все это, выполнить полный вывод типов, проверка типов, удаление сахара в ядро, ссылка на скомпилированный машинный код и выполнение этой вещи в интерпретаторе, все в пределах 2 секунд времени стены, на самом деле чертовски впечатляет, когда вы думаете об этом. С другой стороны, я все еще хочу, чтобы это шло быстрее. ; -)

Компиляция тестера (программы, выполняющей указанный выше цикл) дала небольшую разницу в производительности. Компиляция 20 КБ кода библиотеки, с которым связаны сценарии, дала более заметное улучшение. Но на вызов runhaskell по-прежнему уходит около 1 секунды.

Каждый сгенерированный файл Haskell имеет размер чуть более 1 КБ, но на самом деле изменяется только одна часть файла.Может быть, компиляция файла и использование переключателя GHC -e будет быстрее?

В качестве альтернативы, возможно, это замедлится из-за многократного создания и уничтожения многих процессов ОС? Каждый вызов runhaskell предположительно заставляет ОС исследовать путь системного поиска, находить необходимый двоичный файл, загружать его в память (наверняка он уже находится в кеше диска?), Связывать его с любыми библиотеками DLL и сожги это. Есть ли способ (легко) сохранить работающим один экземпляр GHC вместо того, чтобы постоянно создавать и уничтожать процесс ОС?

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

Предложения?

Обновление: Переход на GHC -e (т.е. теперь все скомпилировано, кроме одного выполняемого выражения) не оказало заметного влияния на производительность. На данный момент кажется довольно очевидным, что это все накладные расходы ОС. Мне интересно, могу ли я создать канал от тестера к GHCi и, таким образом, использовать только один процесс ОС ...

15
задан MathematicalOrchid 17 February 2012 в 12:07
поделиться