2009-08-31 10 views
6

Jeśli parsowania, pozwala tylko powiedzieć, HTML, gdy czytasz nazwę elementu, będzie to korzystne dla intern jest? Logika jest taka, że ​​ten parser będzie parsować te same ciągi (nazwy elementów) w kółko? I kilka dokumentów zostanie przeanalizowanych.Czy struny Interningowe pomogą zwiększyć wydajność w analizatorze składni?

Teoria:

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

To pytanie było motywowane pytaniem string-interning-memory.

+0

Moja sugestia rodzajowy to byłoby - Spróbuj się zmierzyć i jeśli to czyni żadnej różnicy ... (Chociaż wiem, że to nie jest tak naprawdę to, czego po ...) – Rashack

+0

@Rashack zamierzam aby to przetestować, ale uważam, że jest to prawidłowe pytanie i nie widziałem bezpośrednio powiązanych pytań dotyczących analizy tekstu, takich jak treści HTML lub XML. :) –

Odpowiedz

2

nie mogę naprawdę powiedzieć dokładnie, czy pomogłoby to wydajność czy nie. Zależy to od liczby używanych łańcuchów i częstotliwości tworzenia wystąpień tych łańcuchów. Internowanie jest zwykle wykonywane automatycznie, więc jawne sprawdzenie, czy łańcuch jest internowany, może faktycznie zwiększyć obciążenie i zmniejszyć wydajność. Jeśli chodzi o użycie pamięci, internowane łańcuchy mogą zdecydowanie zużywać mniej pamięci.

Jeśli chcesz korzystać internowanie łańcuchów, istnieją lepsze sposoby, aby go osiągnąć. Przede wszystkim, przykleiłabym nazwy twoich elementów w statycznej klasie pełnej publicznych stałych znaków. Dowolny ciąg literalny znaleziony w kodzie źródłowym programu jest zdecydowanie i automatycznie internowany. Takie ciągi są ładowane do puli intern podczas ładowania aplikacji. Jeśli twoje łańcuchy nie mogą być zdefiniowane jako stałe dla przygotowania stażysta kompilacji, to bym po prostu zadzwonić String.Intern (...) zamiast robić pełny trójskładnikowych wyrażenie String.IsInterned (...)? ...: String.Intern (...). Metoda Intern automatycznie sprawdzi, czy łańcuch jest internowany, zwróci internowaną wersję, jeśli jest, i doda łańcuch do puli intern i zwróci ją, jeśli tak nie jest. Nie musisz samodzielnie sprawdzać IsInterned.

Ponownie, nie mogę powiedzieć, czy ręcznie interning ciągi poprawi wydajność. Jeśli użyjesz stałych, będą one automatycznie internowane dla ciebie, w najbardziej optymalny sposób, i to jest najlepsze podejście do poprawy wydajności i wykorzystania pamięci przez regularnie ponownie wykorzystywane ciągi. Szczerze polecam, abyś trzymał się z daleka od interwencji ręcznych i pozwolił ci na optymalizację kompilatora i środowiska wykonawczego.

1

Oczywiście interning ciągi pomóc performanance ale jak @jrista powiedział: „Jeśli używasz stałe, będą one automatycznie internowania dla ciebie ...”.

Oto niektóre artykuły mogą pomóc,

Optimizing C# String Performance

STRESZCZENIE: współdzielenie pamięci, C# utrzymuje coś nazywany "intern tabeli." Jest to lista ciągów, do których obecnie się odwołuje. Jeśli zostanie utworzony nowy ciąg, to sprawdzana jest tabela stółu. Jeśli twój ciąg już tam jest, obie zmienne wskażą na ten sam blok pamięci, który utrzymuje tabela stażysta.

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

Powiązane problemy