Несмотря на семантику, производительность может быть важным фактором при рассмотрении обоих вариантов. Как упоминалось ранее, 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>
».