Несмотря на семантику, производительность может быть важным фактором при рассмотрении обоих вариантов. Как упоминалось ранее, KeyValuePairэто тип значения (структура), тогда как Tuple<>это ссылочный тип (класс). Таким образом, KeyValuePairобъект выделяется в стеке, а объект Tuple<>- в куче, и оптимальный выбор обычно определяется классическими аргументами распределения памяти стека или кучи . Короче говоря, пространство стека ограничено, но обычно имеет очень быстрый доступ. Память кучи намного больше, но работает несколько медленнее.
KeyValuePair<T1, T2>может быть лучшим выбором , если как ключ и значение типа примитивы (типа значения , как int, bool, doubleи т.д.) или Структуры малого размера. С примитивными типами в стеке распределение и освобождение происходит молниеносно. Это действительно может повлиять на производительность, особенно в качестве аргументов для вызовов рекурсивных методов.
С другой стороны, Tuple<T1, T2>вероятно, лучший выбор, если любой из T1или T2является ссылочными типами (например, классами). A, KeyValuePairкоторый содержит указатели на ссылочные типы (например, типы ключей или значений), как бы побеждает цель, поскольку объекты в любом случае нужно будет искать в куче.
Вот тест, который я нашел в Интернете: Tuple vs. KeyValuePair . Единственная проблема с этим тестом заключается в том, что они тестировали KeyValuePair<string, string>vs. Tuple<string, string>, и этот stringтип является необычным и особым типом в .NET, поскольку он может вести себя как тип значения, так и / или ссылочный тип в зависимости от контекста выполнения. Я считаю, KeyValuePair<int, int>что против Tuple<int, int>. Однако даже с учетом недостатков результаты показывают, что различия в производительности могут быть значительными:
8,23 нс - Распределить кортеж
0,32 нс - Распределить KeyValuePair (в 25 раз быстрее!)
1.93 нс - передать кортеж в качестве аргумента.
2.57 нс - передать KeyValuePair в качестве аргумента.
1.91 нс - возврат кортежа
6.09 нс - возврат KeyValuePair
2.79 нс - Загрузить кортеж из списка
4.18 нс - Загрузить KeyValuePair из списка
KeyValuePair- это ключ и значение, aTuple<T1,T2>- это просто пара равных значений. Вы также можете спросить: «Зачем мне использовать,List<Class>если я могу использоватьDictionary<A,B>».