เมื่อใดก็ตามที่คุณมีแอปพลิเคชันซึ่งมีเส้นทางที่มีความสำคัญต่อประสิทธิภาพคุณควรกังวลว่าคุณปฏิบัติต่อหน่วยความจำอย่างไร แอปพลิเคชันฝั่งไคลเอ็นต์ของผู้ใช้ส่วนใหญ่ไม่ได้อยู่ในหมวดหมู่นี้เนื่องจากเป็นกิจกรรมที่ขับเคลื่อนด้วยกิจกรรมหลักและเหตุการณ์ส่วนใหญ่มาจากการโต้ตอบกับผู้ใช้และนั่นไม่ได้มีข้อ จำกัด ด้านประสิทธิภาพ (ถ้ามี)
อย่างไรก็ตามซอฟต์แวร์แบ็คเอนด์จำนวนมากควรให้ความสำคัญกับวิธีการจัดการหน่วยความจำเนื่องจากซอฟต์แวร์จำนวนมากสามารถปรับขนาดเพื่อรองรับจำนวนลูกค้าที่สูงขึ้นจำนวนธุรกรรมที่มากขึ้นแหล่งข้อมูลที่มากขึ้น .... เมื่อคุณเริ่ม คุณสามารถเริ่มต้นวิเคราะห์ว่าผู้ใช้ซอฟต์แวร์หน่วยความจำของคุณและเขียนแผนการจัดสรรแบบกำหนดเองที่ปรับแต่งให้เข้ากับซอฟต์แวร์ของคุณได้อย่างไรแทนที่จะพึ่งพาตัวจัดสรรหน่วยความจำทั่วไปที่สมบูรณ์ซึ่งเขียนขึ้นเพื่อจัดการกับกรณีการใช้งานเท่าที่จะจินตนาการได้
เพื่อให้ตัวอย่างแก่คุณ ... ใน บริษัท แรกของฉันฉันทำงานในแพ็คเกจ Historian ซอฟต์แวร์ที่รับผิดชอบในการรวบรวม / จัดเก็บ / จัดเก็บข้อมูลการควบคุมกระบวนการ (คิดว่าโรงงานโรงไฟฟ้านิวเคลียร์หรือโรงกลั่นน้ำมันที่มีเซ็นเซอร์ 10 ล้านตัว เราเก็บข้อมูลนั้นไว้) ทุกครั้งที่เราวิเคราะห์คอขวดของประสิทธิภาพใด ๆ ที่ป้องกันไม่ให้ Historian ประมวลผลข้อมูลได้มากขึ้นปัญหาส่วนใหญ่เกิดขึ้นในวิธีจัดการหน่วยความจำ เราผ่านความพยายามอย่างยิ่งใหญ่เพื่อให้แน่ใจว่าไม่มีการเรียก malloc / free เว้นแต่ว่าจำเป็นจริงๆ
ในงานปัจจุบันของฉันฉันทำงานกับกล้องบันทึกวิดีโอดิจิตอลและแพ็คเกจการวิเคราะห์ ที่ 30 fps แต่ละช่องจะได้รับเฟรมวิดีโอทุก 33 มิลลิวินาที บนฮาร์ดแวร์ที่เราขายเราสามารถบันทึกวิดีโอได้ 100 ช่อง ดังนั้นจึงเป็นอีกกรณีหนึ่งที่ต้องตรวจสอบให้แน่ใจว่าในเส้นทางที่สำคัญ (การเรียกเครือข่าย => การจับส่วนประกอบ => ซอฟต์แวร์การจัดการเครื่องบันทึก => ส่วนประกอบการจัดเก็บ => ดิสก์) ไม่มีการจัดสรรหน่วยความจำแบบไดนามิก เรามีตัวจัดสรรเฟรมแบบกำหนดเองซึ่งมีที่เก็บขนาดคงที่ของบัฟเฟอร์และใช้ LIFO เพื่อนำบัฟเฟอร์ที่จัดสรรก่อนหน้านี้มาใช้ใหม่ หากคุณต้องการพื้นที่เก็บข้อมูล 600Kb คุณอาจท้ายด้วยบัฟเฟอร์ 1024Kb ซึ่งเปลืองพื้นที่ แต่เนื่องจากมันได้รับการปรับแต่งเป็นพิเศษสำหรับการใช้งานของเราโดยที่การจัดสรรแต่ละครั้งนั้นสั้นมากจึงทำได้ดีมากเพราะใช้บัฟเฟอร์
ในประเภทของแอปพลิเคชันที่ฉันอธิบาย (การย้ายข้อมูลจำนวนมากจาก A ถึง B และการจัดการคำขอไคลเอนต์จำนวนมาก) ไปที่ฮีปและแบ็คเป็นแหล่งสำคัญของคอขวดของประสิทธิภาพการทำงานของ CPU การเก็บรักษาการกระจายตัวของกองให้น้อยที่สุดเป็นประโยชน์รอง แต่เท่าที่ผมสามารถบอกได้ว่าระบบปฏิบัติการที่ทันสมัยที่สุดแล้วใช้กองต่ำการกระจายตัว (อย่างน้อยฉันรู้ว่า Windows ไม่และฉันหวังว่าคนอื่นทำเช่นกัน) โดยส่วนตัวใน 12+ ปีที่ทำงานในสภาพแวดล้อมเหล่านี้ฉันได้เห็นปัญหาการใช้งาน CPU ที่เกี่ยวข้องกับฮีปค่อนข้างบ่อยครั้งในขณะที่ฉันไม่เคยเห็นระบบที่ได้รับความทุกข์ทรมานจากการแยกส่วนของฮีป