2012-01-18 13 views
20

¿Alguien puede explicar los pros y los contras del uso de los tipos de datos Data.Text y Data.ByteString.Char8? ¿Funciona el texto con ASCII solo cambiar estos pros y contras? ¿Sus variantes perezosas cambian la historia también?Data.Text vs Data.ByteString.Char8

Respuesta

28

Data.ByteString.Char8 proporciona funciones para tratar los valores 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 cuanto a la representación: matrices estrictas, sin caja con variantes perezosas basadas en listas de trozos estrictos. La principal diferencia es que ByteString almacena octetos (es decir, Word8 s), mientras que Text almacena Char s, codificado en UTF-16.

Si está trabajando con texto solo en ASCII, entonces el uso de Data.ByteString.Char8 probablemente será más rápido que Text, y usará 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, usar Data.ByteString.Char8 sobre Text es un hack de velocidad - los octetos no son caracteres, y cualquier Haskeller puede aceptar que al usar el tipo correcto se debe priorizar en comparación con la velocidad bruta sin metal. Por lo general, solo debe considerar si ha perfilado el programa y es un cuello de botella. Text está bien optimizado, y la diferencia probablemente será insignificante en la mayoría de los casos.

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

Así que, básicamente:

  1. Data.ByteString.Char8: Para situaciones ASCII puro, donde el rendimiento es de suma importancia, y para manejar los datos binarios "casi" que tiene algunos componentes ASCII.
  2. Data.Text: texto, incluyendo cualquier situación en la que existe la más mínima posibilidad de que se utilice algo distinto a ASCII.
+0

Puedo garantizar que habrá texto ASCII solamente, ya que mi programa procesa archivos C generados por computadora muy específicos. Intentaré ambos en cualquier caso. –

+0

Probablemente iría por 'Data.ByteString.Char8', entonces, ya que esencialmente tratará con un formato binario que solo * se asemeja a * texto. (También recomendaría revisar [attoparsec] (http://hackage.haskell.org/package/attoparsec) para analizar los archivos.) – ehird

+0

También menciona que el texto codifica como UTF-16 y ByteString como un octeto. ¿Esto en general afecta el uso de la memoria? Mi aplicación es una reescritura de código, y tal como está, usa enormes cantidades de memoria que puedo rastrear usando String. Ya practico mis cuerdas, por lo que cualquier mejora sería bienvenida. Es por eso que quiero cambiar los tipos de datos. –

Cuestiones relacionadas