ฉันเพิ่งเริ่มใช้ 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 ด้วยหรือไม่ ถ้าเป็นเช่นนั้นจะแตกต่างกันหรือไม่หากคุณใช้ไวยากรณ์ที่เปิดเผยหรือใช้งานได้