Может ли кто-либо объяснить плюсы и минусы использования типов данных Data.Text
и Data.ByteString.Char8
? Работает ли с текстом ASCII только эти плюсы и минусы? Разве их ленивые варианты меняют историю?
Data.Text vs Data.ByteString.Char8
Ответ 1
Data.ByteString.Char8
предоставляет функции для обработки значений ByteString
в качестве последовательностей 8-разрядных символов ASCII, а Data.Text
- независимый тип, поддерживающий всю Юникод.
ByteString
и Text
по существу одинаковы, поскольку представление - строгие, распакованные массивы с ленивыми вариантами на основе списков строгих фрагментов. Основное отличие состоит в том, что ByteString
хранит октеты (т.е. Word8
s), а Text
хранит Char
s, закодированные в UTF-16.
Если вы работаете с текстом только ASCII, то с помощью Data.ByteString.Char8
, вероятно, будет быстрее, чем Text
, и используйте меньше памяти; однако, вы должны спросить себя, действительно ли вы уверены, что только собираетесь работать с ASCII. В основном, в 99% случаев использование Data.ByteString.Char8
over Text
- это хакеры скорости - октеты не являются символами, и любой Haskeller может согласиться с тем, что использование правильного типа должно быть приоритетным по сравнению с необработанной скоростью без гола. Обычно вы должны учитывать это только в том случае, если вы профилировали программу и это узкое место. Text
хорошо оптимизирован, и в большинстве случаев разница будет незначительной.
Конечно, существуют ситуации, не связанные с скоростью, в которых Data.ByteString.Char8
является оправданным. Рассмотрим файл, содержащий данные, которые по существу являются двоичными, а не текстовыми, но разделяются на строки; использование lines
вполне разумно. Кроме того, вполне возможно, что целое число может быть закодировано в ASCII десятичном значении в контексте двоичного формата; используя readInt
, будет иметь смысл в этом случае.
Итак, в основном:
-
Data.ByteString.Char8
: для чистых ситуаций ASCII, где производительность имеет первостепенное значение, и для обработки "почти двоичных" данных с некоторыми компонентами ASCII. -
Data.Text
: Текст, включая любую ситуацию, где имеется малейшая возможность использования чего-то другого, кроме ASCII.