ฉันเพิ่งเริ่มใช้ LINQ ได้ไม่นานและฉันไม่เห็นการกล่าวถึงความซับซ้อนของรันไทม์สำหรับวิธีการใด ๆ ของ LINQ เลย เห็นได้ชัดว่ามีหลายปัจจัยในการเล่นที่นี่ดังนั้นขอ จำกัด การสนทนาเฉพาะIEnumerableผู้ให้บริการ LINQ-to-Objects ธรรมดา นอกจากนี้สมมติว่าสิ่งที่Funcส่งผ่านมาเป็นตัวเลือก / ตัวเปลี่ยน / ฯลฯ เป็นการดำเนินการ O (1) ราคาถูก
ดูเหมือนว่าเห็นได้ชัดว่าทุกการดำเนินงานที่ผ่านเดียว ( Select, Where, Count, Take/Skip, Any/Allฯลฯ ) จะ O (n) เนื่องจากพวกเขาจะต้องเดินตามลำดับเมื่อ; แม้ว่าเรื่องนี้จะเป็นเรื่องขี้เกียจก็ตาม
สิ่งต่าง ๆ มีความซับซ้อนมากขึ้นสำหรับการดำเนินการที่ซับซ้อนมากขึ้น ชุดเหมือนผู้ประกอบการ ( Union, Distinct, Exceptฯลฯ ) การทำงานโดยใช้GetHashCodeค่าเริ่มต้น (AFAIK) ดังนั้นจึงดูเหมือนว่าเหมาะสมที่จะถือว่าพวกเขากำลังใช้กัญชาตารางภายในทำให้การดำเนินงานเหล่า O (n) เช่นกันโดยทั่วไป สิ่งที่เกี่ยวกับเวอร์ชันที่ใช้IEqualityComparer?
OrderByจะต้องมีการเรียงลำดับดังนั้นส่วนใหญ่เราจะดูที่ O (n log n) จะเป็นอย่างไรหากเรียงลำดับแล้ว แล้วถ้าฉันพูดOrderBy().ThenBy()และให้คีย์เดียวกันกับทั้งสองอย่างล่ะ?
ฉันเห็นGroupBy(และJoin) โดยใช้การเรียงลำดับหรือการแฮช มันคืออะไร?
Containsจะเป็น O (n) บน a Listแต่ O (1) บน a HashSet- LINQ ตรวจสอบคอนเทนเนอร์ที่อยู่เบื้องหลังเพื่อดูว่าสามารถเร่งความเร็วได้หรือไม่?
และคำถามที่แท้จริง - จนถึงตอนนี้ฉันเชื่อมั่นว่าการดำเนินงานมีประสิทธิภาพ อย่างไรก็ตามฉันสามารถฝากเงินได้หรือไม่? ตัวอย่างเช่นคอนเทนเนอร์ STL ระบุความซับซ้อนของทุกการดำเนินการอย่างชัดเจน มีการรับประกันที่คล้ายกันเกี่ยวกับประสิทธิภาพของ LINQ ในข้อกำหนดไลบรารี. NET หรือไม่
คำถามเพิ่มเติม (ในการตอบกลับความคิดเห็น):
ไม่ได้คิดเรื่องค่าโสหุ้ย แต่ฉันไม่ได้คาดหวังว่าจะมี Linq-to-Objects ธรรมดา ๆ โพสต์ CodingHorror กำลังพูดถึง Linq-to-SQL ซึ่งฉันสามารถเข้าใจการแยกวิเคราะห์แบบสอบถามและการสร้าง SQL จะเพิ่มต้นทุน - มีค่าใช้จ่ายที่ใกล้เคียงกันสำหรับผู้ให้บริการ Objects ด้วยหรือไม่ ถ้าเป็นเช่นนั้นจะแตกต่างกันหรือไม่หากคุณใช้ไวยากรณ์ที่เปิดเผยหรือใช้งานได้