Data.Text против Data.ByteString.Char8

Кто-нибудь может объяснить плюсы и минусы использования типов данных Data.Text и Data.ByteString.Char8? Меняет ли эти плюсы и минусы работа с текстом, состоящим только из ASCII? Изменяют ли историю их ленивые варианты?


person Thomas Eding    schedule 18.01.2012    source источник


Ответы (1)


Data.ByteString.Char8 предоставляет функции для обработки значений ByteString как последовательностей 8-битных символов ASCII, а Data.Text — это независимый тип, поддерживающий весь Unicode.

ByteString и Text по существу одинаковы в том, что касается представления — строгие, неупакованные массивы с ленивыми вариантами, основанными на списках строгих фрагментов. Основное отличие состоит в том, что ByteString хранит октеты (то есть Word8s), а Text хранит Chars, закодированные в UTF-16.

Если вы работаете только с текстом ASCII, то использование Data.ByteString.Char8, вероятно, будет быстрее, чем Text, и будет использовать меньше памяти; однако вы должны спросить себя, действительно ли вы уверены, что будете работать только с ASCII. По сути, в 99% случаев использование Data.ByteString.Char8 вместо Text — это уловка скорости — октеты не являются символами, и любой Haskeller может согласиться с тем, что использование правильного типа должно иметь приоритет. над сырой, голой скоростью. Обычно вы должны учитывать это только в том случае, если вы профилировали программу и это узкое место. Text хорошо оптимизирован, и в большинстве случаев разница, вероятно, будет незначительной.

Конечно, есть ситуации, не связанные со скоростью, в которых Data.ByteString.Char8 оправдано. Рассмотрим файл, содержащий данные, которые по существу являются двоичными, а не текстовыми, но разделенными на строки; используя lines вполне разумно. Кроме того, вполне возможно, что целое число может быть закодировано в десятичном формате ASCII в контексте двоичного формата; используя readInt в этом случае было бы логично.

Итак, в основном:

  1. Data.ByteString.Char8: Для ситуаций с чистым ASCII, где производительность имеет первостепенное значение, и для обработки "почти двоичных" данных, содержащих некоторые компоненты ASCII.
  2. Data.Text: текст, включая любую ситуацию, в которой есть малейшая вероятность использования чего-то другого, кроме ASCII.
person ehird    schedule 18.01.2012
comment
Я могу гарантировать, что текст будет только в формате ASCII, так как моя программа обрабатывает очень специфические компьютерные C-файлы. В любом случае попробую оба. - person Thomas Eding; 18.01.2012
comment
Тогда я бы, вероятно, выбрал Data.ByteString.Char8, так как вы, по сути, будете иметь дело с двоичным форматом, который только напоминает текст. (Я бы также рекомендовал использовать attoparsec для разбора файлов.) - person ehird; 19.01.2012
comment
Вы также упоминаете, что Text кодируется как UTF-16, а ByteString как октет. Влияет ли это вообще на использование памяти? Мое приложение представляет собой переписчик кода, и в его нынешнем виде оно использует огромные объемы памяти, которые я могу проследить до использования String. Я уже стажирую свои строки, поэтому любые улучшения будут приветствоваться. Вот почему я хочу изменить типы данных. - person Thomas Eding; 19.01.2012
comment
@trinithis: Что ж, если ваши данные все в ASCII, то Text будет кодировать каждый символ как два байта, а ByteString будет кодировать их как один. Однако, если вы в настоящее время используете String, я бы не стал слишком беспокоиться об этом; String имеет огромные накладные расходы (5 слов на символ(!)), намного больше, чем два других. См. эту сводку об использовании памяти. . - person ehird; 19.01.2012
comment
@trinithis: Хотя, конечно, вы должны иметь в виду, что String выигрывает от совместного использования, а ByteString и Text в виде неупакованных массивов - нет; тем не менее, ByteString и Text оба берут подстроки без копирования, и они настолько меньше для начала, что вам придется очень постараться, чтобы этот недостаток имел значение. - person ehird; 19.01.2012