Pergunta

Você enum tipos mais rápido / mais eficientes do que cordas tipos quando usado como chaves de dicionário?

IDictionary<string,object> or IDictionary<enum,object>

Por uma questão de fato, que tipo de dados é mais adequado como uma chave de dicionário e por quê?

Considere o seguinte: NOTA: Apenas 5 propriedades com simplicidade

struct MyKeys
{
   public string Incomplete = "IN"; 
   public string Submitted = "SU"; 
   public string Processing="PR"; 
   public string Completed = "CO"; 
   public string Closed = "CL";   
}

e

enum MyKeys
{
   Incomplete, 
   Submitted, 
   Processing, 
   Completed, 
   Closed
}

Qual dos acima será melhor se usado como chaves em um dicionário!

Foi útil?

Solução

Certamente a versão enum é melhor (quando ambos estão sentido aplicável e make, é claro). Não apenas para o desempenho (pode ser melhor ou pior, ver muito bom comentário do Rashack) , como é verificado em tempo de compilação e resulta em um código mais limpo.

Você pode contornar o problema comparer usando Dictionary<int, object> e lançando chaves enum para ints ou especificar um comparador personalizado.

Outras dicas

Eu acho que você deve começar por se concentrar na correção. Isto é muito mais importante do que a diferença mínima entre as diferenças de desempenho menores que podem ocorrer dentro de seu programa. Neste caso, eu iria incidir sobre a representação adequada de seus tipos (enum parece ser melhor). Então, mais tarde no perfil de sua aplicação e, se houver um problema, então e só então você deve corrigi-lo.

Fazendo código mais rápido no final do processo é tipicamente um processo para a frente. Leve o link que skolima fornecido. Se você tivesse escolhido enum, teria sido uma solução mais ou menos 10 minutos para remover um potencial problema de desempenho em sua aplicação. Quero salientar a palavra potencial aqui. Este foi definitivamente um problema para NHibernate, mas quanto a saber se é ou não seria um problema para o seu programa seria determinado exclusivamente pelos usos.

Por outro lado, tornar o código mais tarde mais correto no processo tende a ser mais difícil. Em um problema grande o suficiente você vai descobrir que as pessoas começam a tomar dependências sobre os efeitos colaterais do mau comportamento anterior. Isso pode fazer a correção de código sem quebrar outros componentes desafiadores.

Use enum para obter mais limpo e código mais agradável, mas lembre-se de fornecer um comparador personalizado, se você está preocupado com o desempenho: http://ayende.com/Blog/archive/2009/02/21/dictionaryltenumtgt-puzzler.aspx .

pode não se aplicar, mas ...

Esteja ciente de que enums são compilado como constantes que podem causar redistribuição de todos os conjuntos de referência que a enumeração se for alterada. (Ou seja, a constante é codificado em pelo tempo de compilação de todas as montagens que usam).

Eu acho que a versão enum é mais rápido. Sob o capô do referências dicionário tudo por hashcode. Meu palpite é que ele é mais lento para gerar o código hash para uma string. No entanto, esta é provavelmente insignificante mais lento, e é certamente mais rápido do que qualquer coisa como uma String de comparação. Concordo com os outros cartazes que diziam que um enum é mais limpo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top