แม้จะมีความหมาย แต่ประสิทธิภาพอาจเป็นข้อพิจารณาที่สำคัญเมื่อคุณพิจารณาทั้งสองตัวเลือก ดังที่ได้กล่าวไว้ก่อนหน้าKeyValuePair
นี้เป็นประเภทค่า (โครงสร้าง) ในขณะที่Tuple<>
เป็นประเภทการอ้างอิง (คลาส) ดังนั้นการKeyValuePair
จัดสรรในกองและTuple<>
มีการจัดสรรในกองและทางเลือกที่ดีที่สุดมักจะถูกกำหนดโดยการขัดแย้งที่คลาสสิกของกองกับกองจัดสรรหน่วยความจำ ในระยะสั้นพื้นที่สแต็กมี จำกัด แต่โดยทั่วไปมีการเข้าถึงที่รวดเร็วมาก หน่วยความจำฮีปมีขนาดใหญ่กว่ามาก แต่ค่อนข้างช้ากว่า
KeyValuePair<T1, T2>
อาจจะเป็นทางเลือกที่ดีกว่าถ้าทั้งสองคีย์และค่าประเภทพื้นฐาน (ประเภทค่าชอบint
, bool
, double
ฯลฯ ) หรือ structs ขนาดที่เล็ก ด้วยประเภทดั้งเดิมบนสแต็กการจัดสรรและการจัดสรรจะรวดเร็วทันใจ สิ่งนี้สามารถส่งผลต่อประสิทธิภาพโดยเฉพาะอย่างยิ่งเมื่อเป็นอาร์กิวเมนต์ของการเรียกใช้เมธอดแบบเรียกซ้ำ
ในทางกลับกันTuple<T1, T2>
น่าจะเป็นทางเลือกที่ดีกว่าหากเป็นประเภทอ้างอิงT1
หรือT2
ประเภทใดประเภทหนึ่ง (เช่นคลาส) A KeyValuePair
ที่มีตัวชี้ไปยังประเภทการอ้างอิง (เป็นประเภทคีย์หรือค่า) การเรียงลำดับของการเอาชนะวัตถุประสงค์เนื่องจากวัตถุจะต้องได้รับการค้นหาบนฮีปอยู่ดี
นี่คือมาตรฐานที่ฉันพบออนไลน์: Tuple กับ KeyValuePair ปัญหาเดียวของเกณฑ์มาตรฐานนี้คือพวกเขาทดสอบKeyValuePair<string, string>
กับTuple<string, string>
และstring
ประเภทนี้เป็นประเภทที่ผิดปกติและพิเศษใน. NET ซึ่งสามารถทำงานได้ทั้งประเภทค่าและ / หรือประเภทการอ้างอิงขึ้นอยู่กับบริบทการดำเนินการ ผมเชื่อว่าจะได้รับการชนะที่ชัดเจนกับKeyValuePair<int, int>
Tuple<int, int>
แม้จะมีข้อบกพร่องอย่างไรก็ตามผลการศึกษาแสดงให้เห็นว่าความแตกต่างของประสิทธิภาพอาจมีนัยสำคัญ:
8.23 ns - จัดสรร Tuple
0.32 ns - จัดสรร KeyValuePair (เร็วขึ้น 25 เท่า!)
1.93 ns - ผ่าน Tuple เป็นอาร์กิวเมนต์
2.57 ns - ส่ง KeyValuePair เป็นอาร์กิวเมนต์
1.91 ns - Return Tuple
6.09 ns - Return KeyValuePair
2.79 ns - โหลด Tuple จากรายการ
4.18 ns - โหลด KeyValuePair จากรายการ
KeyValuePair
คือคีย์และค่า aTuple<T1,T2>
เป็นเพียงคู่ของค่าที่เท่ากัน คุณยังสามารถถามว่า: "ทำไมฉันจึงควรใช้ aList<Class>
if i can useDictionary<A,B>
"