Vai Internar cadeias de ajudar o desempenho em um analisador?
-
20-09-2019 - |
Pergunta
Se a análise, vamos apenas dizer HTML, depois de ler o nome do elemento, será benéfico para estagiário-lo?A lógica aqui é que este analisador irá analisar o mesmo strings (nomes de elemento) repetidamente novamente?E vários documentos serão analisados.
Teoria:
// elemName is checked for null.
MarkupNode node = new MarkupNode()
{
Name = String.IsInterned(elemName) ? elemName : String.Intern(elemName),
...
};
Esta pergunta foi motivada pela pergunta cadeia-internar-memória.
Solução
Eu realmente não sabia dizer exatamente se isso ajudaria seu desempenho ou não. Dependeria de quantas cordas você usa e com que frequência você cria instâncias dessas seqüências. O internação geralmente é feito automaticamente, portanto, a verificação explicitamente se a string for internada pode realmente aumentar sua sobrecarga e reduzir seu desempenho. Quando se trata de uso de memória, as sequências internadas podem definitivamente usar menos memória.
Se você deseja usar a internação de string, existem algumas maneiras melhores de alcançá -la. Em primeiro lugar, eu coloca seus nomes de elementos em uma classe estática cheia de constantes públicas de string. Qualquer string literal encontrado no código -fonte do seu programa está definitivamente e automaticamente internado. Tais strings são carregadas no pool interno quando seu aplicativo é carregado. Se suas cordas não puderem ser definidas como constantes para a preparação de estagiários de tempo de compilação, então eu simplesmente ligaria String.intern (...) Em vez de fazer a expressão ternária completa String.isinterned (...)? ...: String.intern (...). O método do Intern verificará automaticamente se a string está internada, retornará a versão internada, se for e adicionará a string ao pool interno e retornará isso se não estiver. Não há necessidade de verificar manualmente o ISNTERNED.
Novamente, não posso dizer se as seqüências de strings que internam manualmente melhorarão o desempenho. Se você usar constantes, elas serão automaticamente internadas para você, da maneira mais ideal, e essa é a melhor abordagem para melhorar o desempenho e o uso de memória de seqüências de cordas reutilizadas regularmente. Sinceramente, recomendo que você fique longe da internação manual e deixe o compilador e a otimização do tempo de execução para você.
Outras dicas
Claro, estagiando cadeias de ajuda performanance mas como o @jrista disse: "Se você usar constantes, eles serão automaticamente internado para você,...".
Aqui estão alguns artigos podem ajudá-lo,
Otimizando A Cadeia De Caracteres C# Desempenho
RESUMO:Compartilhamento de Memória, C# mantém algo chamado de "estagiário tabela." Esta é uma lista de cadeias de caracteres que são actualmente referenciado.Se uma nova string é criada, então o estagiário tabela é verificada.Se a sua seqüência já está lá, então ambas as variáveis apontam para o mesmo bloco de memória mantida pelo estagiário tabela.
http://blog.cumps.be/string-concatenation-vs-memory-allocation/