Bất chấp ngữ nghĩa, hiệu suất có thể là một yếu tố quan trọng khi bạn xem xét cả hai lựa chọn. Như đã đề cập trước đây, KeyValuePair
là một kiểu giá trị (struct), trong khi đó Tuple<>
là một kiểu tham chiếu (lớp). Do đó, cái KeyValuePair
được cấp phát trên ngăn xếp và Tuple<>
được cấp phát trên đống, và lựa chọn tối ưu thường được xác định bởi các đối số cổ điển của Phân bổ bộ nhớ ngăn xếp so với . Tóm lại, không gian ngăn xếp có giới hạn, nhưng nhìn chung có khả năng truy cập rất nhanh. Bộ nhớ heap lớn hơn nhiều nhưng hơi chậm hơn.
KeyValuePair<T1, T2>
có thể là lựa chọn tốt hơn nếu cả hai khóa và giá trị loại là nguyên thủy (kiểu giá trị thích int
, bool
, double
, vv) hoặc cấu trúc có kích thước nhỏ. Với các kiểu nguyên thủy trên ngăn xếp, việc phân bổ và phân bổ giao dịch diễn ra nhanh như chớp. Điều này thực sự có thể ảnh hưởng đến hiệu suất, đặc biệt là đối số để gọi phương thức đệ quy.
Mặt khác, Tuple<T1, T2>
có thể là lựa chọn tốt hơn nếu một trong hai T1
hoặc T2
là các kiểu tham chiếu (như các lớp). Loại KeyValuePair
chứa các con trỏ tới các kiểu tham chiếu (như kiểu khóa hoặc giá trị) sẽ đánh bại mục đích vì dù sao thì các đối tượng cũng cần được tra cứu trên heap.
Đây là điểm chuẩn mà tôi tìm thấy trực tuyến: Tuple so với KeyValuePair . Vấn đề duy nhất với điểm chuẩn này là họ đã thử nghiệm KeyValuePair<string, string>
so với Tuple<string, string>
và string
kiểu này là một kiểu bất thường và đặc biệt trong .NET ở chỗ nó có thể hoạt động giống như kiểu giá trị và / hoặc kiểu tham chiếu tùy thuộc vào ngữ cảnh thực thi. Tôi tin rằng KeyValuePair<int, int>
sẽ là một người chiến thắng rõ ràng chống lại Tuple<int, int>
. Tuy nhiên, ngay cả với những khiếm khuyết, kết quả cho thấy sự khác biệt về hiệu suất có thể là đáng kể:
8,23 ns - Phân bổ Tuple
0,32 ns - Phân bổ KeyValuePair (nhanh hơn 25 lần!)
1,93 ns - Truyền Tuple dưới dạng đối số
2,57 ns - Truyền KeyValuePair làm đối số
1,91 ns - Return Tuple
6,09 ns - Return KeyValuePair
2,79 ns - Tải Tuple từ Danh sách
4,18 ns - Tải KeyValuePair từ Danh sách
KeyValuePair
là một khóa và một giá trị, aTuple<T1,T2>
chỉ là một cặp giá trị bằng nhau . Bạn cũng có thể hỏi: "tại sao tôi nên sử dụngList<Class>
nếu tôi có thể sử dụngDictionary<A,B>
".