2009-08-31 7 views
6

Si está analizando, digamos HTML, una vez que lea el nombre del elemento, ¿será beneficioso internarlo? La lógica aquí es que este analizador analizará las mismas cadenas (nombres de elementos) una y otra vez. Y varios documentos serán analizados.¿Las cadenas de intercesión ayudarán a mejorar el rendimiento en un analizador?

Teoría:

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

Esta pregunta fue motivada por la cuestión string-interning-memory.

+0

Mi sugerencia genérica a esto sería - hacerlo por uno mismo y medir si hace alguna diferencia ... (Aunque sé que no es realmente lo que está después ...) – Rashack

+0

@Rashack pretendo para probarlo, pero también creo que es una pregunta válida, y no vi una pregunta directamente relacionada con el análisis de texto, como HTML o contenido basado en XML. :) –

Respuesta

2

No podría decir exactamente si esto ayudaría a su rendimiento o no. Dependerá de cuántas cadenas use y con qué frecuencia crea instancias de esas cadenas. Por lo general, la internación se realiza de forma automática, por lo que el chequeo explícito de si la cadena está intervenida puede aumentar su sobrecarga y reducir su rendimiento. Cuando se trata de uso de memoria, las cadenas internas definitivamente pueden usar menos memoria.

Si desea utilizar el interinato de cuerdas, existen algunas formas mejores de lograrlo. En primer lugar, colocaría los nombres de sus elementos en una clase estática llena de constantes de cadenas públicas. Cualquier literal de cadena que se encuentre en el código fuente de su programa se interna definitivamente y de forma automática. Tales cadenas se cargan en el grupo interno cuando se carga la aplicación. Si sus cadenas no se pueden definir como constantes para la preparación interna en tiempo de compilación, simplemente llamaría a String.Intern (...) en lugar de hacer la expresión ternaria completa String.IsInterned (...)? ...: String.Intern (...). El método Intern verificará automáticamente si la cadena está internada, devolverá la versión interna si es así, y de lo contrario agregará la cadena al grupo interno y lo devolverá si no lo está. No es necesario comprobar manualmente IsInterned usted mismo.

De nuevo, no puedo decir si las cadenas de prácticas manuales mejorarán el rendimiento. Si usa constantes, serán internados automáticamente, de la manera más óptima, y ​​ese es el mejor enfoque para mejorar el rendimiento y el uso de la memoria de cadenas reutilizadas regularmente. Sinceramente, le recomendaría que se mantenga alejado de la práctica manual, y deje que el compilador y el tiempo de ejecución manejen la optimización para usted.

1

Por supuesto, las cadenas de internados ayudan a la performancia, pero como @jrista dijo "Si usas constantes, serán automáticamente internados por ti, ...".

Éstos son algunos artículos podrían ayudarle,

Optimizing C# String Performance

RESUMEN: Memoria Compartir, C# mantiene algo que se llama una "tabla interna de". Esta es una lista de cadenas a las que se hace referencia actualmente. Si se crea una nueva cadena, se verifica la tabla interna. Si su cadena ya está allí, ambas variables apuntarán al mismo bloque de memoria que mantiene la tabla interna.

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

Cuestiones relacionadas