Domanda

C #: Che occupa più memoria? Una stringa o byte?

Diciamo che ho una riga che legge "Il mio testo", in cui la forma sarebbe quella linea utilizzare più memoria, come un byte o una stringa?

È stato utile?

Soluzione

L'array di byte. Questo memorizzerà il testo come ASCII (1 byte per carattere) caratteri, mentre una stringa di .NET utilizza Unicode che sono più grandi. Tuttavia ricordare che le stringhe .NET sono probabilmente più utile e in una grande applicazione la differenza probabilmente non farà una differenza enorme.

(si noti anche che se si utilizzano caratteri ASCII nella stringa di .NET allora i caratteri saranno ancora solo 1 byte ciascuno)

Altri suggerimenti

Dipende la codifica dei caratteri di byte. È possibile convertire qualsiasi stringa in un array di byte, ma si deve scegliere la codifica; non esiste un unico standard o codifica corretta. Quello che una volta si chiamava ASCII è inutile al di fuori del mondo di lingua inglese.

Nella maggior parte dei codifiche, "Testo" sarebbe lungo 7 byte. Ma gettare in alcuni caratteri accentati europei, o caratteri giapponesi, e quelli (se possono essere rappresentati a tutti) possono essere più di uno o due byte ciascuno. In alcune codifiche, con alcune stringhe di testo, la rappresentazione byte-matrice può essere più grande della rappresentazione Unicode interno utilizzato dal System.String.

Essere Unicode non significa che la stringa ci vorrà più di un byte per carattere, significa solo che "potrebbe" prendere più di un byte per carattere.

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

  

Quello che occupa più memoria?

Quindi ti stai chiedendo circa le dimensioni del rappresentazione in memoria . Usi .net UTF-16 per archi, che significa vostro esempio sarà rappresentata da 14 byte, come si può vedere in questo esadecimale (UTF-16):

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

La dimensione della matrice di byte dipende dalla codifica che si utilizza per rappresentare il testo. Se si utilizza UTF-16 , come questo

Encoding.Unicode.GetBytes(string)

ovviamente ottenere gli stessi 14 byte. Se si utilizza UTF-8 , invece:

Encoding.UTF8.GetBytes(string)

si ottiene un array di byte 7:

4d 79 20 54 65 78 74

Questa è la stessa dimensione (e la stessa rappresentazione) come ASCII , perché il vostro esempio utilizza solo i caratteri che sono disponibili nel set di caratteri ASCII. Tutti questi personaggi sono, per definizione, lo stesso in UTF-8.

Ora, se si utilizzano i caratteri non-ASCII , invece, dicono che il "日" giapponese, la codifica UTF-8 avrebbe bisogno di 3 byte:

e6 97 a5

UTF-16 avrebbe bisogno solo 2 byte:

e5 65

Il tentativo di convertire il carattere giapponese per ASCII produrrebbe un'eccezione o semplicemente utilizzare un "?" carattere, a seconda di come si configura il Encoding, perché ASCII non può rappresentare altro che i caratteri ASCII.

Un altro esempio un po 'diversa, il carattere europeo "a". 2 byte UTF-8:

c3 a4

Anche 2 byte UTF-16:

e4 00

ASCII non può rappresentare questo personaggio.

In sintesi, la memoria consumata dipende dai dati effettivi nelle stringhe e ciò che si utilizza la codifica a rappresentarlo .

Tutte le suddette parla del consumo di memoria per i dati grezzi solo, si ricorda che, al fine di calcolare il il consumo di memoria totale che avrebbe dovuto includere anche < strong> metadati che fa parte di ogni array e stringhe, come il suo length , e, nel caso di stringhe .net, anche un terminatore null (2 ulteriori byte con il valore '0'). Il numero di byte per i metadati è costante e relativamente piccolo, in modo che qualsiasi differenza tra stringhe e array di lì avrebbe importanza solo se si aveva tonnellate di molto piccoli testi.

Entrambi sono abbastanza vicino. Una sola vera risposta:

Profilo sul vostro quadro / architettura.

L'array di byte avrebbe meno memoria a meno che non si aveva diverse copie della stringa, nel qual caso la stringa sarebbe occupare meno memoria grazie alla tabella di stringhe.

Ma reali domande è, è veramente importante? Ci sono un sacco di vantaggi che si ottiene di utilizzare la stringa come una stringa, invece di immagazzinarla come un array di byte.

Non so i particolari, dal momento che la tua domanda era molto stretta, ma sento odore ottimizzazione prematura.

C'è un buon post sul blog qui che dà un'equazione per quanto spazio una stringa occupa, così come varie interazioni con StringBuilder & istanza assegnazioni

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top