.net - кортежи - Когда лучше использовать Tuple и KeyValuePair?




keyvaluepair c# (3)

Вы действительно задаете неправильный вопрос в правильном вопросе, используя класс (Tuple) _ лучше, чем Struct (KVP), и в этом случае ответ - это то, что вы хотите использовать для них, и здесь дается ответ. Структуры по сравнению с классами

Обычно я использовал тип KeyValuePair<TKey,TValue> всякий раз, когда у меня есть данные, которые связаны с парой в том смысле, что один из них является ключом к другому. Если данные не связаны, то тип Tuple<T1,T2> имеет больше смысла, и я бы пошел с этим.

Теперь я просто прочитал эту статью о том, почему вообще избегать KeyValuePair<TKey,TValue> и предпочитает Tuple<T1,T2> . Основным аргументом является преимущество производительности Tuple<T1,T2> .

Внешняя производительность, есть ли причина, по которой KVP будет лучшим выбором, чем Tuple<T1,T2> ?


Несмотря на семантику, производительность может быть важным фактором, поскольку вы рассматриваете оба варианта. Как уже упоминалось ранее, KeyValuePair представляет собой тип значения (struct), тогда как Tuple<> является ссылочным типом (классом). Следовательно, KeyValuePair выделяется в стеке, а Tuple<> выделяется в куче, а оптимальный выбор обычно определяется классическими аргументами Stack vs. Heap Memory Allocation . Короче говоря, пространство стека ограничено, но, как правило, имеет очень быстрый доступ. Память кучи намного больше, но несколько медленнее.

KeyValuePair<T1, T2> может быть лучшим выбором, если оба ключа и значения являются примитивами (такими типами значений, как int , bool , double и т. Д.) Или структурами небольшого размера. С примитивными типами в стеке, распределение и освобождение молниеносно. Это может повлиять на производительность, особенно в качестве аргументов для рекурсивных вызовов методов.

С другой стороны, Tuple<T1, T2> , вероятно, лучший выбор, если T1 или T2 являются ссылочными типами (например, классы). KeyValuePair который содержит указатели на ссылочные типы (как типы ключей или значений), порождает цель, так как объекты все равно должны быть просмотрены на куче.

Вот тест, который я нашел онлайн: Tuple vs. KeyValuePair . Единственная проблема с этим эталоном состоит в том, что они протестировали KeyValuePair<string, string> vs. Tuple<string, string> , а тип string - необычный и специальный тип в .NET, поскольку он может вести себя как тип значения и / или ссылочный тип в зависимости от контекста выполнения. Я считаю, что KeyValuePair<int, int> был бы явным победителем против Tuple<int, int> . Однако, несмотря на недостатки, результаты показывают, что различия в производительности могут быть значительными:

8.23 ns - Выделить Tuple
0.32 ns - Выделить KeyValuePair (25 раз быстрее!)

1.93 ns - Pass Tuple в качестве аргумента
2.57 ns - передать KeyValuePair в качестве аргумента

1.91 нс - Возвратный кортеж
6.09 ns - Возврат KeyValuePair

2.79 нс - загрузка кортежа из списка
4.18 ns - Загрузить KeyValuePair из списка


KeyValuePair - это структура, а Tuple - класс.

Это основное отличие, которое влияет на то, как объекты копируются по ссылке или значениям.

и, следовательно, Tuple<T1,T2> при передаче только использует «4 байта» в 32-битной ОС, тогда как KeyValuePair<K,V> требует больше основанных на «K и V»,

Во всяком случае, сравнение Tuple и KeyValuePair - не очень хорошая идея (для меня это не имеет смысла), поскольку обе служат для разных целей.





semantics