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 T1ou T2forem tipos de referência (como classes). Um KeyValuePairque 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 stringtipo é 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>".