Когда лучше использовать Кортеж против KeyValuePair?
Я, как правило, используется KeyValuePair<TKey,TValue> тип всякий раз, когда у меня есть данные, связанные с парой в том смысле, что один является ключом к другому. Если данные не связаны, то Tuple<T1,T2> тип имеет больше смысла, и я пошел бы с этим.
теперь я просто читаю в этой статье о том, почему вообще избежать KeyValuePair<TKey,TValue> и предпочитают Tuple<T1,T2>. Основным аргументом является преимущество производительности Tuple<T1,T2>.
внешняя производительность, есть ли причина, по которой KVP будет лучшим выбором чем Tuple<T1,T2>?
4 ответов:
ну, тип можно считать плохо названным, например. В KeyValuePair в качестве имени должно представлять собой ключ и значение. Что если два объекта на самом деле не ключ и значение, только две вещи? Если бы я увидел метод или свойство, которое имело тип
KeyValuePair<TKey, TValue>, Я ожидал бы, что значения KVP будут ключом и значением. Это действительно просто вопрос общения намерения и сделать его ясным для себя в будущем, или, возможно, других членов команды. Кортеж не указывает, что рода ассоциации.кортежи также облегчают добавление другого значения, делая его 3-кортежем (или триплетом, однако вы хотите его назвать). Некоторые языки .NET, такие как F#, есть специальный синтаксис вокруг кортежей, а также.
для перспективы реализации,
Tupleделает много вещейKeyValuePairнет. Кортежи сопоставимы, они реализуютIComparableиIStructuralEquatableинтерфейсы, так что это облегчает сравнение двух кортежей.
KeyValuePair- Это struct иTuple- это класс.это основное различие, которое влияет на то, как объекты копируются ли по ссылке или значениям.
и поэтому
Tuple<T1,T2>при передаче просто использует "4byte" в 32-битной ОС, тогда какKeyValuePair<K,V>требуется больше на основе "K и V"в любом случае сравнение кортежа и KeyValuePair не является хорошей идеей(не имеет смысла для меня), так как оба служат разным целям.
несмотря на семантику, производительность может быть важным фактором, поскольку вы рассматриваете оба варианта. Как уже упоминалось ранее,
KeyValuePair- Это тип значения (struct), тогда какTuple<>является ссылочным типом (классом). Таким образом,KeyValuePairвыделяется в стеке иTuple<>выделяется в куче, и оптимальный выбор обычно определяется классическим доводы стек против выделения памяти кучи. Короче говоря, пространство стека ограничено, но в целом имеет очень быстрый доступ. Память кучи намного больше, но несколько медленнее.
KeyValuePair<T1, T2>может быть лучшим выбором, если оба типа ключа и значения являются примитивами (типы значений, такие какint,bool,doubleи т. д.) или структуры небольшого размера. С примитивными типами в стеке распределение и освобождение происходит молниеносно. это действительно может повлиять на производительность, особенно в качестве аргументов для рекурсивного вызова метода.С другой стороны,
Tuple<T1, T2>скорее всего лучший выбор, Если либоT1илиT2являются ссылочными типами (как классы). АKeyValuePairкоторый содержит указатели на ссылочные типы (как типы ключей или значений), как бы поражает цель, так как объекты нужно будет искать в куче в любом случае.вот тест, который я нашел в интернете:Кортеж против KeyValuePair. Единственная проблема с этим бенчмарком заключается в том, что они протестировали
KeyValuePair<string, string>иTuple<string, string>иstringтип-это необычный и специальный тип в .NET in что он может вести себя как тип значения и/или ссылочный тип в зависимости от контекста выполнения. Я верюKeyValuePair<int, int>был бы явным победителем в отношенииTuple<int, int>. Однако даже при наличии недостатков результаты показывают, что различия в производительности могут быть значительными:8.23 наноконструкции выделить объект tuple
0.32 НС -- Выделить KeyValuePair (25 раз быстрее!)1.93 наноконструкции проехать кортеж, как аргумент
2.57 ns -- передать KeyValuePair в качестве аргумента1.91 ns -- Return Tuple
6.09 ns -- Return KeyValuePair2.79 НС -- загрузить кортеж из списка
4.18 НС -- загрузить KeyValuePair из списка
вы действительно задаете неправильный вопрос правильный вопрос использует класс(Кортеж)_ лучше, чем структура (KVP) в этом случае ответ-это то, для чего вы хотите их использовать, и ответ дается здесь структуры против классов
Comments