2009-08-31 3 views
6

Wenn Sie analysieren, sagen wir einfach HTML, sobald Sie den Elementnamen lesen, wird es vorteilhaft sein, es zu internieren? Die Logik hier ist, dass dieser Parser die gleichen Zeichenfolgen (Elementnamen) immer wieder parsen wird? Und mehrere Dokumente werden analysiert.Werden interne Zeichenfolgen die Leistung in einem Parser unterstützen?

Theorie:

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

Diese Frage nach der Frage string-interning-memory motiviert war.

+0

Meine allgemeine Anregung dazu wäre - versuchen, sie es und messen, ob es einen Unterschied macht ... (Obwohl ich weiß, dass es nicht wirklich ist, was Sie nach ...) – Rashack

+0

@Rashack Ich beabsichtige, um es zu testen, aber ich denke auch, dass es eine gültige Frage ist, und ich habe keine direkt damit verbundene Frage in Bezug auf Textanalyse, wie HTML oder XML-basierten Inhalt, gesehen. :) –

Antwort

2

Ich könnte nicht wirklich genau sagen, ob dies Ihrer Leistung helfen würde oder nicht. Dies hängt davon ab, wie viele Zeichenfolgen Sie verwenden und wie häufig Sie Instanzen dieser Zeichenfolgen erstellen. Das Internieren erfolgt in der Regel automatisch. Wenn Sie also explizit überprüfen, ob die Zeichenfolge intern ist, erhöht sich möglicherweise Ihr Overhead und die Leistung wird verringert. Wenn es um die Speichernutzung geht, können internierte Strings definitiv weniger Speicher verbrauchen.

Wenn Sie String-Interning verwenden möchten, gibt es einige bessere Möglichkeiten, dies zu erreichen. In erster Linie würde ich Ihre Elementnamen in einer statischen Klasse voller öffentlicher String-Konstanten festhalten. Ein beliebiges Zeichenfolgenliteral, das in Ihrem Programmquellcode gefunden wird, wird definitiv und automatisch interniert. Solche Strings werden beim Laden Ihrer Anwendung in den internen Pool geladen. Wenn Ihre Zeichenfolgen nicht als Konstanten für Kompilierung interne Vorbereitung definiert werden können, dann würde ich einfach String.Intern (...) lieber als den vollständigen ternären Ausdruck String.IsInterned (...)? ...: String.Intern (...). Die Methode Intern prüft automatisch, ob die Zeichenfolge interniert ist, gibt die internierte Version zurück und fügt andernfalls die Zeichenfolge dem internen Pool hinzu und gibt diese zurück, wenn dies nicht der Fall ist. Sie müssen IsInterned nicht manuell überprüfen.

Auch hier kann ich nicht sagen, ob manuell internieren Saiten die Leistung verbessern wird. Wenn Sie Konstanten verwenden, werden sie automatisch auf optimale Weise für Sie interniert. Dies ist der beste Ansatz, um die Leistung und die Speichernutzung regelmäßig verwendeter Strings zu verbessern. Ich würde ehrlich empfehlen, dass Sie sich vom manuellen Internieren fernhalten und den Compiler und die Laufzeit die Optimierung für Sie übernehmen lassen.

1

Natürlich helfen Interning Strings Leistung aber wie @jrista sagte "Wenn Sie Konstanten verwenden, werden sie automatisch für Sie interniert, ...".

Hier sind einige Artikel, die Ihnen,

Optimizing C# String Performance

Zusammenfassung helfen können: Freigabe-Speicher, C# hält einen so genannten "intern Tisch." Dies ist eine Liste der Strings, auf die derzeit verwiesen wird. Wenn eine neue Zeichenfolge erstellt wird, wird die interne Tabelle überprüft. Wenn Ihre Zeichenfolge bereits vorhanden ist, zeigen beide Variablen auf denselben Speicherblock, der von der internen Tabelle verwaltet wird.

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

Verwandte Themen