สระอาร์เรย์
ทุกวันนี้เราไม่ค่อยใช้อาร์เรย์ ในกรณีส่วนใหญ่ เราใช้ List<T> ซึ่งมีฟังก์ชันการทำงานมากกว่าและอิงตามอาร์เรย์ที่อยู่ภายใต้ประทุน แต่มีบางสถานการณ์ที่ประสิทธิภาพเป็นกุญแจสำคัญในขณะที่ต้องจัดการกับวัตถุจำนวนมาก
สิ่งที่ทำให้ฉันประหลาดใจคืออาร์เรย์แบบธรรมดามีประสิทธิภาพมากกว่าแบบรายการถึงสองเท่า และยังสามารถปรับแต่งได้ด้วย ArrayPool
ในบทความนี้ ผมจะแสดงวิธีใช้ ArrayPool พร้อมตัวอย่างโค้ดและประสิทธิภาพการเปรียบเทียบ
ที่เก็บรหัส
ArrayPool คืออะไร
ArrayPool เป็นกลุ่มทรัพยากรที่อนุญาตให้ใช้อินสแตนซ์ของประเภทอาร์เรย์ซ้ำได้ คุณสามารถใช้มันเพื่อเช่าและส่งคืนบัฟเฟอร์ (อาร์เรย์) มันจะปรับปรุงประสิทธิภาพเมื่อคุณสร้างและทำลายอาร์เรย์บ่อยๆ ซึ่งใช้หน่วยความจำและGARBAGE COLLECTORมาก คลาสนี้ปลอดภัยสำหรับเธรด และคุณสามารถใช้งานได้พร้อมกัน ขณะกลับไปที่พูล คุณสามารถเลือกที่จะล้างหรือไม่ล้างเนื้อหาอาร์เรย์ การล้างข้อมูลจะใช้เวลามากขึ้น แต่สถานการณ์ของคุณอาจต้องได้รับอาร์เรย์ว่างในแต่ละครั้ง
วิธีการใช้งาน
มีสองวิธีในการเข้าถึงอาร์เรย์จากหน่วยความจำพูล
สิ่งแรกและง่ายที่สุดคือการใช้ คุณสมบัติArrayPool Shared
ArrayPool<T>.แชร์
คุณจะได้รับการใช้งานเริ่มต้นของพูล ประกอบด้วยอาร์เรย์ขนาดต่างๆ มันสามารถส่งคืนอาร์เรย์ที่ใหญ่กว่าที่คุณร้องขอ แต่ไม่เล็กลงอย่างแน่นอน พูลที่ใช้ร่วมกันเป็นวิธีที่สะดวกในการนำอาร์เรย์กลับมาใช้ใหม่ แต่ก็มีวิธีที่ดีกว่า
วิธีที่มีประสิทธิภาพมากกว่าคือการเริ่มต้นพูลของคุณโดยใช้วิธีการสร้าง
ArrayPool<T>.สร้าง()
ArrayPool<T>.Create(int maxArrayLength, int maxArraysPerBucket)
สร้างเมธอดส่งคืนอินสแตนซ์ที่กำหนดเองของพูล คุณต้องแคชเพื่อเข้าถึงจากตำแหน่งต่างๆ เพื่อนำกลับมาใช้ใหม่ วิธีการกำหนดพารามิเตอร์สามารถช่วยให้ได้ประสิทธิภาพที่ดีที่สุด จะสร้างอินสแตนซ์ที่จัดกลุ่มอาร์เรย์ที่มีความยาวไม่เกินmaxArrayLengthเป็นบัคเก็ตขนาดmaxArraysPerBucket
ใช้ประโยชน์จากการรวมอาร์เรย์ใน C# เพื่อลดการจัดสรรและปรับปรุงประสิทธิภาพของแอปพลิเคชันของคุณ
เกณฑ์มาตรฐาน
นี่คือการทดสอบที่ตรงไปตรงมา เราจะเปรียบเทียบความแตกต่างระหว่างการสร้างอาร์เรย์ใหม่และการเช่าจากพูล ในแต่ละกรณี เราจะวนซ้ำองค์ประกอบ 1_000_000 รายการ ฉันจะรวม List<T> ไว้ในเกณฑ์มาตรฐานเพื่อแสดงข้อได้เปรียบด้านประสิทธิภาพของอาร์เรย์
ที่เก็บรหัส
ข้อสรุป
สิ่งที่ทำให้ฉันประหลาดใจที่สุดคืออาร์เรย์ธรรมดามีประสิทธิภาพเป็นสองเท่าของลิสต์ในแง่ของความเร็วและการใช้หน่วยความจำ และยังสามารถปรับแต่งได้ด้วย ArrayPool เห็นได้ชัดว่าการใช้สระว่ายน้ำเป็นวิธีที่จะไป
มีความแตกต่างของเวลาที่เห็นได้ชัดเจนระหว่างการใช้อาร์เรย์มาตรฐานและจากกลุ่ม ความแตกต่างของเวลาคือเวลาที่ต้องใช้ในการจัดสรรหน่วยความจำเมื่อสร้างอาร์เรย์ใหม่ในแต่ละครั้ง แน่นอนว่ายังมีความแตกต่างในการจัดสรรหน่วยความจำอีกด้วย ArrayPool ไม่จำเป็นต้องจัดสรรหน่วยความจำใหม่ มันใช้บล็อกเดียวกันซ้ำ
เพื่อเป็นการเตือน ฉันได้เพิ่ม 'พูลแบบกำหนดเองโดยไม่ใช้แคช' เพื่อให้คุณเห็นว่าเกิดอะไรขึ้นเมื่อคุณสร้างพูลใหม่ทุกครั้ง โดยพื้นฐานแล้วมันเหมือนกับการสร้างอาร์เรย์ใหม่ทุกครั้ง
ในตัวอย่างง่ายๆ นี้ เป็นการยากที่จะแสดงความแตกต่างของประสิทธิภาพระหว่าง ArrayPool ที่ใช้ร่วมกันและแบบกำหนดเอง จะเห็นได้ชัดเจนเมื่อใช้อาร์เรย์หลายขนาด
การใช้ ArrayPool อาจไม่ใช่วิธีที่สะดวกที่สุดเสมอไป แต่บางครั้งอาจช่วยประหยัดพลังงานในการประมวลผลได้มากเมื่อจำเป็น





































![รายการที่เชื่อมโยงคืออะไร? [ส่วนที่ 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)