2009-05-26 11 views

Respuesta

0

La matriz de bytes. Esto almacenará su texto como caracteres ASCII (1 byte por carácter), mientras que una cadena .NET utiliza Unicode, que son más grandes. Sin embargo, recuerde que las cadenas .NET son probablemente más útiles y, en una aplicación grande, la diferencia probablemente no supondrá una gran diferencia.

(Tenga en cuenta también que si sólo utiliza caracteres ASCII en la cadena de .NET a continuación, los personajes serán todavía sólo será de 1 byte cada uno)

+0

Awesome first answer, amigo! +1 – Randolpho

+0

Muy, muy informativa respuesta. Estoy muy agradecido por su respuesta informativa. No puedo enfatizar esto lo suficiente, ¡GRACIAS! –

+0

Si lo almacena como una matriz de bytes, generalmente solo podrá almacenar ASCII; si necesita caracteres UTF8 extendidos, use una cadena y tome la memoria, si guardar unos pocos bytes es muy importante. – thecoop

1

Ambos están bastante cerca. Sólo una respuesta real:

Perfil en su marco/arquitectura.

0

La matriz de bytes tomaría menos memoria a menos que tenía varias copias de la cadena, en cuyo caso la cadena sería ocupan menos memoria gracias a la tabla de cadenas.

Pero la pregunta real es, ¿realmente importa? Hay muchos beneficios que obtiene al utilizar la cadena como una cadena, en lugar de almacenarla como una matriz de bytes.

No sé los detalles, ya que su pregunta era muy estrecho, pero huelo la optimización prematura.

0

Hay una buena entrada en el blog here que da una ecuación para la cantidad de espacio de una cadena toma, así como varias interacciones con StringBuilder & asignaciones de instancia

12

Depende de la codificación de caracteres de la matriz de bytes. Puede convertir cualquier cadena en una matriz de bytes, pero debe elegir la codificación; no hay una sola codificación estándar o correcta. Lo que solía llamarse ASCII no sirve para nada fuera del mundo de habla inglesa.

En la mayoría de las codificaciones, "Mi texto" sería de 7 bytes de longitud. Pero agregue algunos caracteres acentuados europeos, o caracteres japoneses, y aquellos (si pueden representarse en absoluto) pueden tener más de uno o dos bytes cada uno. En algunas codificaciones, con algunas cadenas de texto, la representación del array de bytes puede ser mayor que la representación interna Unicode utilizada por System.String.

+2

IMO, una respuesta mejor que la aceptada, ya que hace hincapié en la importancia de la elección de codificación. –

+0

No hay justicia en el mundo, te digo. –

2

Ser Unicode no significa que la cadena se llevará más de un byte por carácter, sólo significa que "podría" tomar hasta más de un byte por carácter.

http://www.joelonsoftware.com/articles/Unicode.html

+0

Depende del tipo de Unicode. UTF16 ocupa más de uno por personaje –

+0

Exactamente, como dije ... "podría". También has mezclado "carácter" y "byte" en tu comentario. –

1

Lo que ocupa más memoria?

Por lo que se preguntan sobre el tamaño de la representación en memoria. .NET utiliza UTF-16 para cuerdas, que significa que su ejemplo será representado por 14 bytes, como se puede ver en este volcado hexadecimal (UTF-16LE):

4d 00 79 00 20 00 54 00 65 00 78 00 74 00 

El tamaño de la matriz de bytes dependerá de la codificación que utilice para representar el texto.Si utiliza UTF-16, como este

Encoding.Unicode.GetBytes(string) 

es obvio que obtiene los mismos 14 bytes. Si utiliza UTF-8 lugar:

Encoding.UTF8.GetBytes(string) 

obtiene una matriz de 7 bytes:

4d 79 20 54 65 78 74 

Este es el mismo tamaño (y la misma representación) como ASCII, debido a que su ejemplo solo usa caracteres que están disponibles en el juego de caracteres ASCII. Todos esos caracteres son, por definición, los mismos en UTF-8.

Ahora bien, si se utiliza caracteres no ASCII lugar, digamos que los japoneses "日", la codificación UTF-8 necesitaría 3 bytes:

e6 97 a5 

UTF-16 necesitaría sólo 2 bytes:

e5 65 

Intentar convertir el carácter japonés a ASCII produciría una excepción o simplemente usar un "?" carácter, según cómo configure el Encoding, porque ASCII no puede representar nada excepto caracteres ASCII.

Otro ejemplo ligeramente diferente, el carácter europeo "ä". 2 bytes en UTF-8:

c3 a4 

también 2 bytes en UTF-16:

e4 00 

ASCII no puede representar a este personaje.

En resumen, la memoria consumida depende de los datos reales en sus cadenas y qué codificación usar para representarla.

Todas las conversaciones anteriores sobre el consumo de memoria de los datos en bruto solamente, tenga en cuenta que con el fin de calcular el consumo de memoria total también tendría que incluir metadatos que es parte de cada matriz y cadena, como su longitud, y, en el caso de cadenas .net, también un terminador nulo (2 bytes adicionales con el valor '0'). El número de bytes para los metadatos es constante y relativamente pequeño, por lo que cualquier diferencia entre cadena y matriz solo importaría si tuviera toneladas de textos muy pequeños.

Cuestiones relacionadas