2009-08-31 17 views
6

Se si sta analizzando, consente solo di dire HTML, una volta letto il nome dell'elemento, sarà utile internarlo? La logica qui è che questo parser analizzerà più e più volte le stesse stringhe (nomi di elementi)? E molti documenti verranno analizzati. TeoriaLe stringhe Interning aiutano le prestazioni in un parser?

:

// elemName is checked for null. 
MarkupNode node = new MarkupNode() 
{ 
    Name = String.IsInterned(elemName) ? elemName : String.Intern(elemName), 
    ... 
}; 

Questa domanda è stata motivata dalla domanda string-interning-memory.

+0

Il mio suggerimento generico per questo sarebbe - provate voi stessi e misurare se fa alcuna differenza ... (anche se so che non è proprio quello che cercate ...) – Rashack

+0

@Rashack intendo per testarlo, ma penso anche che sia una domanda valida, e non ho visto una domanda direttamente correlata riguardo l'analisi del testo, come il contenuto HTML o basato su XML. :) –

risposta

2

Non potrei davvero dire esattamente se questo potrebbe aiutare la tua performance o meno. Dipenderà dal numero di stringhe che usi e dalla frequenza con cui crei le istanze di quelle stringhe. L'interning viene generalmente eseguito automaticamente, quindi controllare esplicitamente se la stringa è internata può effettivamente aumentare il sovraccarico e ridurre le prestazioni. Quando si parla di utilizzo della memoria, le stringhe internamente possono sicuramente utilizzare meno memoria.

Se si desidera utilizzare internamento stringa, ci sono alcuni modi migliori per raggiungerlo. Innanzitutto, vorrei incollare i nomi degli elementi in una classe statica piena di costanti di stringa pubbliche. Qualsiasi stringa letterale trovata nel codice sorgente del programma viene definitivamente e automaticamente internata. Tali stringhe vengono caricate nel pool interno quando viene caricata l'applicazione. Se le stringhe non possono essere definite come costanti per la preparazione dello stagista in fase di compilazione, chiamare semplicemente String.Intern (...) anziché eseguire l'intera espressione ternaria String.IsInterned (...)? ...: String.Intern (...). Il metodo Intern controlla automaticamente se la stringa è internata, restituisce la versione internata, se lo è, e altrimenti aggiungerà la stringa al pool interno e restituirà tale valore se non lo è. Non è necessario controllare manualmente IsInterned.

Ancora una volta, non posso dire se le stringhe di internamento manuale miglioreranno le prestazioni. Se si utilizzano le costanti, queste verranno automaticamente internate per te, nel modo più ottimale, e questo è l'approccio migliore per migliorare le prestazioni e l'utilizzo della memoria delle stringhe regolarmente riutilizzate. Consiglierei sinceramente di evitare l'internamento manuale e lasciare che il compilatore e il runtime gestiscano l'ottimizzazione per te.

1

Naturalmente, le stringhe di interning aiutano l'esecuzione ma come ha detto @jrista "Se si usano le costanti, verranno automaticamente internate per te ...".

Ecco alcuni articoli potrebbero aiutarvi,

Optimizing C# String Performance

SOMMARIO: Memory Sharing, C# mantiene qualcosa chiamato un "tavolo stagista". Questa è una lista di stringhe che sono attualmente referenziate. Se viene creata una nuova stringa, viene verificata la tabella interna. Se la stringa è già presente, entrambe le variabili punteranno allo stesso blocco di memoria gestito dalla tabella interna.

http://blog.cumps.be/string-concatenation-vs-memory-allocation/