Кто-нибудь может объяснить плюсы и минусы использования типов данных Data.Text
и Data.ByteString.Char8
? Меняет ли эти плюсы и минусы работа с текстом, состоящим только из ASCII? Изменяют ли историю их ленивые варианты?
Data.Text против Data.ByteString.Char8
Ответы (1)
Data.ByteString.Char8
предоставляет функции для обработки значений ByteString
как последовательностей 8-битных символов ASCII, а Data.Text
— это независимый тип, поддерживающий весь Unicode.
ByteString
и Text
по существу одинаковы в том, что касается представления — строгие, неупакованные массивы с ленивыми вариантами, основанными на списках строгих фрагментов. Основное отличие состоит в том, что ByteString
хранит октеты (то есть Word8
s), а Text
хранит Char
s, закодированные в UTF-16.
Если вы работаете только с текстом ASCII, то использование Data.ByteString.Char8
, вероятно, будет быстрее, чем Text
, и будет использовать меньше памяти; однако вы должны спросить себя, действительно ли вы уверены, что будете работать только с ASCII. По сути, в 99% случаев использование Data.ByteString.Char8
вместо Text
— это уловка скорости — октеты не являются символами, и любой Haskeller может согласиться с тем, что использование правильного типа должно иметь приоритет. над сырой, голой скоростью. Обычно вы должны учитывать это только в том случае, если вы профилировали программу и это узкое место. Text
хорошо оптимизирован, и в большинстве случаев разница, вероятно, будет незначительной.
Конечно, есть ситуации, не связанные со скоростью, в которых Data.ByteString.Char8
оправдано. Рассмотрим файл, содержащий данные, которые по существу являются двоичными, а не текстовыми, но разделенными на строки; используя lines
вполне разумно. Кроме того, вполне возможно, что целое число может быть закодировано в десятичном формате ASCII в контексте двоичного формата; используя readInt
в этом случае было бы логично.
Итак, в основном:
Data.ByteString.Char8
: Для ситуаций с чистым ASCII, где производительность имеет первостепенное значение, и для обработки "почти двоичных" данных, содержащих некоторые компоненты ASCII.Data.Text
: текст, включая любую ситуацию, в которой есть малейшая вероятность использования чего-то другого, кроме ASCII.
Data.ByteString.Char8
, так как вы, по сути, будете иметь дело с двоичным форматом, который только напоминает текст. (Я бы также рекомендовал использовать attoparsec для разбора файлов.)
- person ehird; 19.01.2012
Text
будет кодировать каждый символ как два байта, а ByteString
будет кодировать их как один. Однако, если вы в настоящее время используете String
, я бы не стал слишком беспокоиться об этом; String
имеет огромные накладные расходы (5 слов на символ(!)), намного больше, чем два других. См. эту сводку об использовании памяти. .
- person ehird; 19.01.2012
String
выигрывает от совместного использования, а ByteString
и Text
в виде неупакованных массивов - нет; тем не менее, ByteString
и Text
оба берут подстроки без копирования, и они настолько меньше для начала, что вам придется очень постараться, чтобы этот недостаток имел значение.
- person ehird; 19.01.2012