Философия http-простой setRequestBodyLBS
Я пытаюсь разработать http-клиент с помощью http-simple library. Некоторая реализация библиотеки кажется мне запутанной.
Эта библиотека интенсивно использует Conduit; однако есть также эта функция 'setRequestBodyLBS' и, что интересно, здесь отсутствует функция 'setRequestBodyBS'. Документально подтверждено, что Conduit и ленивый IO плохо работают вместе. Итак, мой вопрос, почему бы не наоборот? т.е. реализовать версию BS функции вместо версии LBS? Какова идея выбора, сделанного здесь?
1 ответ
Внутренне ленивая строка байтов похожа на связанный список строгих строк байтов. Переход от строгой строки к ленивой обходится дешево (вы строите связанный список из одного элемента), но движение в обратном направлении обходится дороже (вам нужно выделить непрерывный кусок памяти для объединенных байтов, а затем скопировать каждый кусок из список).
Ленивый ввод-вывод использует ленивые строки байтов, но они также полезны в других контекстах, например, когда у вас есть строгие чанки, поступающие из внешнего источника, и вы хотите простой способ их накопления без необходимости предварительно выделять большую область памяти или выполнять частые перераспределения / копий. Вместо этого вы просто сохраняете список фрагментов, которые вы позже представляете как ленивую строку байтов. (Когда конкатенации списков становятся дорогими или гранулярность слишком мала, вы можете использовать Builder
в качестве дальнейшей оптимизации.)
Другим частым случаем использования является сериализация некоторой составной структуры данных (скажем, Value
). Если все, что вы собираетесь сделать, это сбросить сгенерированные байты в файл или сетевой запрос, не имеет большого смысла выполнять относительно дорогостоящую консолидацию сериализованных байтов каждого подкомпонента. При необходимости вы всегда можете выполнить это позже с toStrict
тем не мение.