เหตุใดการประมวลผลอาร์เรย์ที่เรียงลำดับจึงช้ากว่าอาร์เรย์ที่ไม่เรียงลำดับ
ฉันมีรายการTuple<long,long,string>วัตถุที่สร้างขึ้นแบบสุ่มจำนวน 500,000 รายการซึ่งฉันกำลังค้นหา "ระหว่าง" อย่างง่าย: var data = new List<Tuple<long,long,string>>(500000); ... var cnt = data.Count(t => t.Item1 <= x && t.Item2 >= x); เมื่อฉันสร้างอาเรย์แบบสุ่มของฉันและทำการค้นหาค่าที่สร้างแบบสุ่ม 100 ค่าxการค้นหาจะเสร็จสมบูรณ์ในเวลาประมาณสี่วินาที การรู้ถึงสิ่งมหัศจรรย์ที่ยิ่งใหญ่ที่การเรียงลำดับมีผลต่อการค้นหาแต่ฉันตัดสินใจที่จะเรียงลำดับข้อมูลของฉัน - ก่อนItem1แล้วตามด้วยItem2และสุดท้ายItem3- ก่อนที่จะทำการค้นหา 100 ครั้ง ฉันคาดว่ารุ่นที่เรียงไว้จะทำงานได้เร็วขึ้นเล็กน้อยเนื่องจากการคาดเดาของสาขา: ความคิดของฉันคือเมื่อเราไปถึงจุดที่Item1 == xการตรวจสอบเพิ่มเติมทั้งหมดt.Item1 <= xจะทำนายสาขาอย่างถูกต้องว่า "ไม่รับ" เร่งส่วนหางของ ค้นหา. ฉันประหลาดใจมากการค้นหาใช้เวลานานเป็นสองเท่าในอาร์เรย์ที่เรียงลำดับ ! ฉันลองสลับไปมาตามลำดับที่ฉันรันการทดลองของฉันและใช้เมล็ดพันธุ์ที่แตกต่างกันสำหรับตัวสร้างตัวเลขสุ่ม แต่ผลที่ออกมานั้นเหมือนกัน: การค้นหาในอาเรย์ที่ไม่เรียงลำดับนั้นวิ่งเร็วกว่าการค้นหาในอาเรย์เดียวกันเกือบสองเท่า เรียง! ใครบ้างมีคำอธิบายที่ดีของผลแปลก ๆ นี้? …