Data.Text vs Data.ByteString.Char8 - PullRequest
       24

Data.Text vs Data.ByteString.Char8

20 голосов
/ 18 января 2012

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

1 Ответ

28 голосов
/ 18 января 2012

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

ByteString и Text, по сути, одинаковы в отношении представления - строгие распакованные массивы с отложенными вариантами, основанные на списках строгих блоков. Основное отличие состоит в том, что ByteString хранит октеты (то есть Word8 с), тогда как Text хранит Char с, закодированные в UTF-16.

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

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

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

  1. Data.ByteString.Char8: Для ситуаций чистого ASCII, где производительность имеет первостепенное значение, и для обработки «почти двоичных» данных, содержащих некоторые компоненты ASCII.
  2. Data.Text: текст, включая любую ситуацию, когда существует малейшая вероятность использования чего-либо, кроме ASCII.
...