haskell text bytestring

haskell - Data.Text vs Data.ByteString.Char8



(1)

¿Alguien puede explicar los pros y los contras del uso de los tipos de datos Data.Text y Data.ByteString.Char8 ? ¿Trabajar con texto solo en ASCII cambia estas ventajas y desventajas? ¿Sus variantes perezosas también cambian la historia?


Data.ByteString.Char8 proporciona funciones para tratar los valores de ByteString como secuencias de caracteres ASCII de 8 bits, mientras que Data.Text es un tipo independiente que admite la totalidad de Unicode.

ByteString y Text son esencialmente lo mismo, en lo que se refiere a la representación: arreglos estrictos, sin caja, con variantes perezosas basadas en listas de fragmentos estrictos. La principal diferencia es que ByteString almacena octetos (es decir, Word8 s), mientras que Text almacena Char s, codificados en UTF-16.

Si está trabajando con texto solo en ASCII, entonces el uso de Data.ByteString.Char8 probablemente sea más rápido que el de Text y use menos memoria; sin embargo, debe preguntarse si está realmente seguro de que solo va a trabajar con ASCII. Básicamente, en el 99% de los casos, el uso de Data.ByteString.Char8 sobre Text es un hack de velocidad: los octetos no son caracteres, y cualquier Haskeller puede estar de acuerdo en que se debe dar prioridad al uso del tipo correcto sobre la velocidad pura y simple. Por lo general, solo debe considerarlo si ha perfilado el programa y es un cuello de botella. Text está bien optimizado, y la diferencia probablemente será despreciable en la mayoría de los casos.

Por supuesto, hay situaciones no relacionadas con la velocidad en las que se justifica Data.ByteString.Char8 . Considere un archivo que contiene datos que son esencialmente binarios, no de texto, pero separados en líneas; el uso de lines es completamente razonable. Además, es totalmente concebible que un entero se codifique en ASCII decimal en el contexto de un formato binario; el uso de readInt tendría perfecto sentido en ese caso.

Así que básicamente:

  1. Data.ByteString.Char8 : para situaciones ASCII puras donde el rendimiento es primordial y para manejar datos "casi binarios" que tienen algunos componentes ASCII.
  2. Data.Text : texto, incluida cualquier situación en la que exista la menor posibilidad de que se utilice algo distinto de ASCII.