Незважаючи на семантику, продуктивність може бути важливим фактором, оскільки ви розглядаєте обидва варіанти. Як уже згадувалося раніше, KeyValuePair
це тип значення (struct), тоді як the Tuple<>
- тип посилання (клас). Отже, KeyValuePair
виділяється в стеку, а в Tuple<>
купі, і оптимальний вибір зазвичай визначається класичними аргументами Stack vs. Heap Memory Allocation . Коротше кажучи, простір стека обмежений, але, як правило, має дуже швидкий доступ. Пам'ять купи значно більша, але дещо повільніша.
KeyValuePair<T1, T2>
може бути кращим вибором , якщо як ключ і значення типу примітиви (типу значення , як int
, bool
, double
і т.д.) або Структури малого розміру. З примітивними типами в стеку розподіл та вивільнення відбувається блискавично. Це може реально вплинути на продуктивність, особливо як аргументи для викликів рекурсивних методів.
З іншого боку, Tuple<T1, T2>
швидше за все, кращий вибір, якщо той T1
чи інший T2
є посилальними типами (наприклад, класи). А, KeyValuePair
яке містить покажчики на типи посилань (як типи ключів або значень), перешкоджає цілі, оскільки об’єкти все одно потрібно буде шукати в купі.
Ось орієнтир, який я знайшов в Інтернеті: Tuple проти KeyValuePair . Єдина проблема з цим тестом полягає в тому, що вони тестували KeyValuePair<string, string>
проти 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>
- просто пара рівних значень. Ви також можете запитати: "навіщо мені використовувати a,List<Class>
якщо я можу використовуватиDictionary<A,B>
".