Почему в Compiled Heist (Haskell) необходимо создавать соединения заранее?

Я могу понять, почему шаблоны HTML (файлы .tpl) должны быть обработаны заранее (с loadTemplates) и помещены в файл HeistConfig. Это позволяет Heist заранее обрабатывать HTML в более эффективном формате.

Однако я не понимаю, почему splices тоже нужно создавать заранее и помещать внутрь файла HeistConfig. Какая польза от этого? Я не вижу преимущества, потому что соединения все равно вычисляются во время выполнения. Какой мыслительный процесс стоит за этим?

Я думаю, это может быть связано с тем, что соединение также может выполнять код во время загрузки (в дополнение к времени выполнения). Это основное объяснение?


person haskellHQ    schedule 28.08.2016    source источник


Ответы (1)


Функции вставки (скомпилированные и интерпретированные) работают с узлами. Думайте о соединениях как о сигнатуре типа Node -> m [Node]. Это относительно дорогая операция, поскольку она работает на уровне DOM. Узлы результата соединения вставляются обратно в дерево DOM, затем все дерево должно быть преобразовано в ByteString. Идея скомпилированного ограбления заключалась в том, чтобы сделать как можно больше этой работы по рендерингу заранее, во время инициализации приложения. Результатом инициализации будет [Chunk], где Chunk может быть либо статической ByteString, либо динамической m ByteString (фактические типы немного отличаются). Скомпилированные соединения должны быть обработаны до того, как инициализация преобразует весь шаблон из [Node] в [Chunk]. И чтобы максимизировать эффективность времени выполнения, это преобразование происходит во время инициализации приложения.

Для получения дополнительной информации ознакомьтесь с этими ссылками:

http://snapframework.com/docs/tutorials/compiled-splices

https://github.com/snapframework/heist/wiki/Compiled-Splice-Formulations

person mightybyte    schedule 28.08.2016
comment
Но если вычисления (выборка из базы данных и т. д.) и их преобразование в порции в любом случае должны выполняться во время выполнения, зачем мне создавать соединение во время загрузки? Зачем это повышать эффективность? - person haskellHQ; 28.08.2016
comment
Я могу понять, почему создание соединения во время загрузки повысит эффективность, если оно делает что-то важное во время загрузки. Но как насчет сплайсов, которые выполняют всю свою работу во время выполнения? В этом суть моего вопроса. - person haskellHQ; 28.08.2016
comment
@haskellHQ Перечитайте свои комментарии, вы уже сказали это сами. Таким образом, некоторые вставки могут быть оптимизированы, в то время как вставки, которые должны выполняться во время выполнения, нельзя оптимизировать ни в коем случае. Между оптимизацией того, что можно оптимизировать, и отсутствием оптимизации ничего, что должен выбрать разработчик библиотеки? - person Bakuriu; 28.08.2016
comment
@Bakuriu Это хороший момент. могучий байт: Можете ли вы подтвердить, что комментарии Бакуриу отражают мыслительный процесс дизайнера библиотеки (ваш?)? Это бы все прояснило. - person haskellHQ; 28.08.2016
comment
Я добавил еще один связанный вопрос: stackoverflow.com/questions/39195348/ - person haskellHQ; 28.08.2016
comment
@haskellHQ Я думаю, что @Bakuriu во многом прав. Тип соединения — Node -> m [Node], что по своей сути является медленным. Неважно, имеет ли ваш сплайс эффективный тип m ByteString. Хейст никогда этого не видит. Если вам нужны простые шаблоны интерполяции строк, лучше использовать что-то вроде усы. - person mightybyte; 29.08.2016