Apesar da semântica, o desempenho pode ser uma consideração importante quando você considera as duas opções. Conforme mencionado anteriormente, o KeyValuePair
é um tipo de valor (estrutura), enquanto o Tuple<>
é um tipo de referência (classe). Portanto, o KeyValuePair
é alocado na pilha e o Tuple<>
é alocado no heap, e a escolha ideal geralmente é determinada pelos argumentos clássicos de Stack vs. Heap Memory Allocation . Resumindo, o espaço da pilha é limitado, mas geralmente tem acesso muito rápido. A memória heap é muito maior, mas um pouco mais lenta.
KeyValuePair<T1, T2>
pode ser a escolha melhor se tanto a chave e valor tipos são primitivos (tipos de valor, como int
, bool
, double
, etc.) ou estruturas de pequena dimensão. Com tipos primitivos na pilha, a alocação e desalocação são extremamente rápidas. Isso pode realmente afetar o desempenho, especialmente como argumentos para chamadas de método recursivas.
Por outro lado, Tuple<T1, T2>
é provavelmente a melhor escolha se T1
ou T2
forem tipos de referência (como classes). Um KeyValuePair
que contém ponteiros para tipos de referência (como os tipos de chave ou valor) meio que anula o propósito, pois os objetos precisarão ser pesquisados no heap de qualquer maneira.
Aqui está um benchmark que encontrei online: Tuple vs. KeyValuePair . O único problema com esse benchmark é que eles testaram KeyValuePair<string, string>
vs. Tuple<string, string>
, e o string
tipo é um tipo incomum e especial no .NET, pois pode se comportar como um tipo de valor e / ou um tipo de referência dependendo do contexto de execução. Eu acredito que o KeyValuePair<int, int>
teria sido um claro vencedor contra Tuple<int, int>
. Mesmo com as deficiências, no entanto, os resultados mostram que as diferenças de desempenho podem ser significativas:
8,23 ns - Alocar Tupla
0,32 ns - Alocar KeyValuePair (25x mais rápido!)
1,93 ns - Passe Tupla como argumento
2,57 ns - Passe KeyValuePair como argumento
1,91 ns - Tupla de retorno
6,09 ns - Return KeyValuePair
2,79 ns - Carregar Tupla da Lista
4,18 ns - Carregar KeyValuePair da Lista
KeyValuePair
é uma chave e um valor, aTuple<T1,T2>
é apenas um par de valores iguais . Você também pode perguntar: "por que devo usar umList<Class>
se eu posso usarDictionary<A,B>
".