Философия http-простой setRequestBodyLBS

Я пытаюсь разработать http-клиент с помощью http-simple library. Некоторая реализация библиотеки кажется мне запутанной.

Эта библиотека интенсивно использует Conduit; однако есть также эта функция 'setRequestBodyLBS' и, что интересно, здесь отсутствует функция 'setRequestBodyBS'. Документально подтверждено, что Conduit и ленивый IO плохо работают вместе. Итак, мой вопрос, почему бы не наоборот? т.е. реализовать версию BS функции вместо версии LBS? Какова идея выбора, сделанного здесь?

1 ответ

Решение

Внутренне ленивая строка байтов похожа на связанный список строгих строк байтов. Переход от строгой строки к ленивой обходится дешево (вы строите связанный список из одного элемента), но движение в обратном направлении обходится дороже (вам нужно выделить непрерывный кусок памяти для объединенных байтов, а затем скопировать каждый кусок из список).

Ленивый ввод-вывод использует ленивые строки байтов, но они также полезны в других контекстах, например, когда у вас есть строгие чанки, поступающие из внешнего источника, и вы хотите простой способ их накопления без необходимости предварительно выделять большую область памяти или выполнять частые перераспределения / копий. Вместо этого вы просто сохраняете список фрагментов, которые вы позже представляете как ленивую строку байтов. (Когда конкатенации списков становятся дорогими или гранулярность слишком мала, вы можете использовать Builder в качестве дальнейшей оптимизации.)

Другим частым случаем использования является сериализация некоторой составной структуры данных (скажем, Value). Если все, что вы собираетесь сделать, это сбросить сгенерированные байты в файл или сетевой запрос, не имеет большого смысла выполнять относительно дорогостоящую консолидацию сериализованных байтов каждого подкомпонента. При необходимости вы всегда можете выполнить это позже с toStrict тем не мение.

Другие вопросы по тегам