Que é mais rápido / mais eficiente: Dictionary ou Dictionary ?
-
03-07-2019 - |
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!
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 int
s 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.