У меня есть небольшая тестовая среда. Он выполняет цикл, который выполняет следующие действия:
Создает небольшой исходный файл Haskell.
Выполните это с помощью runhaskell
. Программа генерирует различные файлы на диске.
Обработать только что сгенерированные файлы на диске.
Это происходит несколько десятков раз. Оказывается, runhaskell
занимает большую часть времени выполнения программы.
С одной стороны, тот факт, что runhaskell
удается загрузить файл с диска, разметить его, проанализировать, выполнить анализ зависимостей, загрузить с диска еще 20 КБ текста, разметить и проанализировать все это, выполнить полный вывод типов, проверка типов, удаление сахара в ядро, ссылка на скомпилированный машинный код и выполнение этой вещи в интерпретаторе, все в пределах 2 секунд времени стены, на самом деле чертовски впечатляет, когда вы думаете об этом. С другой стороны, я все еще хочу, чтобы это шло быстрее. ; -)
Компиляция тестера (программы, выполняющей указанный выше цикл) дала небольшую разницу в производительности. Компиляция 20 КБ кода библиотеки, с которым связаны сценарии, дала более заметное улучшение. Но на вызов runhaskell
по-прежнему уходит около 1 секунды.
Каждый сгенерированный файл Haskell имеет размер чуть более 1 КБ, но на самом деле изменяется только одна часть файла.Может быть, компиляция файла и использование переключателя GHC -e
будет быстрее?
В качестве альтернативы, возможно, это замедлится из-за многократного создания и уничтожения многих процессов ОС? Каждый вызов runhaskell
предположительно заставляет ОС исследовать путь системного поиска, находить необходимый двоичный файл, загружать его в память (наверняка он уже находится в кеше диска?), Связывать его с любыми библиотеками DLL и сожги это. Есть ли способ (легко) сохранить работающим один экземпляр GHC вместо того, чтобы постоянно создавать и уничтожать процесс ОС?
В конечном счете, я полагаю, что всегда есть GHC API. Но, насколько я понимаю, это кошмарно сложно использовать, очень недокументировано и подвержено радикальным изменениям при каждом незначительном выпуске GHC. Задача, которую я пытаюсь выполнить, очень проста, поэтому я действительно не хочу усложнять ее, чем это необходимо.
Предложения?
Обновление: Переход на GHC -e
(т.е. теперь все скомпилировано, кроме одного выполняемого выражения) не оказало заметного влияния на производительность. На данный момент кажется довольно очевидным, что это все накладные расходы ОС. Мне интересно, могу ли я создать канал от тестера к GHCi и, таким образом, использовать только один процесс ОС ...