การจัดการหน่วยความจำในการเขียนโปรแกรมกลายเป็นปัญหาที่ไม่เกี่ยวข้องหรือไม่?
การจัดการหน่วยความจำ (หรือการควบคุม) เป็นเหตุผลหลักที่ฉันใช้ C และ C ++
หน่วยความจำราคาถูกตอนนี้
หน่วยความจำไม่เร็ว เรายังคงดูทะเบียนจำนวนน้อยเช่นแคชข้อมูล 32KB สำหรับ L1 ใน i7, 256KB สำหรับ L2 และ 2MB สำหรับ L3 / core ที่กล่าวว่า:
หากเราไม่พูดในแง่ของแพลตฟอร์มเป้าหมายที่มีข้อ จำกัด อย่างเข้มงวดในหน่วยความจำใช้งาน (เช่นระบบฝังตัวและอื่น ๆ ) การใช้หน่วยความจำควรเป็นสิ่งที่ควรคำนึงถึงเมื่อเลือกภาษาที่ใช้งานทั่วไปในปัจจุบันหรือไม่?
การใช้หน่วยความจำในระดับทั่วไปอาจจะไม่ ฉันทำไม่ได้นิดหน่อยในเรื่องที่ฉันไม่ชอบความคิดเกี่ยวกับแผ่นจดบันทึกที่ใช้พูด DRAM 50 เมกะไบต์และพื้นที่ฮาร์ดดิสก์หลายร้อยเมกะไบต์แม้ว่าฉันจะมีเนื้อที่ว่างเหลือเฟือและอีกมากมาย ฉันอยู่ที่นี่มานานแล้วและมันก็รู้สึกแปลก ๆ และเป็นเรื่องยากสำหรับฉันที่จะเห็นว่าแอพพลิเคชั่นที่เรียบง่ายนั้นใช้หน่วยความจำค่อนข้างมากสำหรับสิ่งที่ควรจะทำได้ด้วยกิโลไบต์ ที่กล่าวว่าฉันอาจจะอยู่กับตัวเองถ้าฉันพบสิ่งนั้นถ้ามันยังดีและตอบสนอง
เหตุผลที่การจัดการหน่วยความจำมีความสำคัญสำหรับฉันในสาขาของฉันคือไม่ลดการใช้หน่วยความจำโดยทั่วไป การใช้หน่วยความจำหลายร้อยเมกะไบต์ไม่จำเป็นต้องทำให้แอปพลิเคชั่นช้าลงในลักษณะที่ไม่สำคัญหากไม่มีการเข้าถึงหน่วยความจำนั้นบ่อยครั้ง (เช่นเมื่อคลิกปุ่มหรือป้อนข้อมูลในรูปแบบอื่น ๆ ของผู้ใช้เท่านั้น กำลังพูดถึงผู้เล่น Starcraft เกาหลีที่อาจคลิกปุ่มล้านครั้งต่อวินาที)
เหตุผลที่มันสำคัญในสาขาของฉันคือการทำให้หน่วยความจำแน่นและเข้าด้วยกันซึ่งเข้าถึงได้บ่อยมาก (เช่น: วนซ้ำทุกเฟรม) ในเส้นทางที่สำคัญเหล่านั้น เราไม่ต้องการที่จะพลาดแคชทุกครั้งที่เราเข้าถึงองค์ประกอบหนึ่งล้านรายการที่ต้องเข้าถึงทั้งหมดในลูปทุกเฟรม เมื่อเราย้ายหน่วยความจำตามลำดับชั้นจากหน่วยความจำช้าไปยังหน่วยความจำที่รวดเร็วในกลุ่มก้อนขนาดใหญ่พูดว่า 64 ไบต์แคชบรรทัดมันมีประโยชน์จริง ๆ ถ้า 64 ไบต์นั้นมีข้อมูลที่เกี่ยวข้องถ้าเราสามารถใส่องค์ประกอบหลาย ๆ หากรูปแบบการเข้าถึงของเราเป็นแบบที่เราใช้ทุกอย่างก่อนที่ข้อมูลจะถูกขับออกมา
ข้อมูลที่เข้าถึงได้บ่อยครั้งสำหรับองค์ประกอบนับล้านอาจมีขนาดเพียง 20 เมกะไบต์แม้ว่าเราจะมีกิกะไบต์ มันยังคงสร้างโลกที่แตกต่างในอัตราเฟรมที่วนรอบข้อมูลนั้นทุก ๆ เฟรมที่ดึงออกมาถ้าหน่วยความจำแน่นและใกล้กันเพื่อลดการพลาดแคชและนั่นคือสิ่งที่การจัดการ / ควบคุมหน่วยความจำมีประโยชน์มาก ตัวอย่างภาพง่ายๆบนทรงกลมที่มีจุดยอดไม่กี่ล้าน:
ด้านบนนั้นช้ากว่าเวอร์ชันที่ไม่แน่นอนของฉันเนื่องจากมันกำลังทดสอบโครงสร้างข้อมูลแบบถาวรที่เป็นตัวแทนของ mesh แต่นอกเหนือไปจากนั้นฉันก็พยายามดิ้นรนเพื่อให้ได้อัตราเฟรมดังกล่าวแม้ในครึ่งหนึ่งของข้อมูลนั้น (ฮาร์ดแวร์ยอมรับว่าเร็วขึ้น ) เพราะฉันไม่ได้รับการลดการพลาดแคชและการใช้หน่วยความจำสำหรับข้อมูลตาข่าย Meshes เป็นโครงสร้างข้อมูลที่ยากที่สุดที่ฉันเคยทำในเรื่องนี้เพราะพวกมันเก็บข้อมูลที่พึ่งพาซึ่งกันและกันซึ่งต้องมีการซิงค์เหมือนรูปหลายเหลี่ยมขอบจุดยอดแผนที่พื้นผิวมากที่สุดเท่าที่ผู้ใช้ต้องการแนบน้ำหนักกระดูก แผนที่สีชุดการเลือกเป้าหมาย morph น้ำหนักขอบวัสดุรูปหลายเหลี่ยม ฯลฯ ฯลฯ
ฉันได้ออกแบบและติดตั้งระบบตาข่ายจำนวนมากในช่วงสองสามทศวรรษที่ผ่านมาและความเร็วของพวกเขามักจะแปรผันตามการใช้หน่วยความจำของพวกเขา แม้ว่าฉันจะทำงานด้วยความทรงจำมากกว่าตอนที่ฉันเริ่มระบบตาข่ายใหม่ของฉันเร็วกว่าการออกแบบครั้งแรกของฉันมากกว่า 10 เท่า (เกือบ 20 ปีที่แล้ว) และในระดับที่สูงเพราะพวกเขาใช้เวลาประมาณ 1 ใน 10 ของ ความทรงจำ. รุ่นใหม่ล่าสุดใช้การบีบอัดแบบมีดัชนีเพื่อบีบอัดข้อมูลให้ได้มากที่สุดและแม้จะมีการประมวลผลการบีบอัด แต่การบีบอัดนั้นเพิ่มประสิทธิภาพได้จริงเพราะอีกครั้งเรามีหน่วยความจำที่รวดเร็วมีค่าเพียงเล็กน้อย ตอนนี้ฉันสามารถใส่ตาข่ายโพลิกอนหนึ่งล้านเส้นที่มีพิกัดพื้นผิวการสร้างขอบวัสดุการกำหนดวัสดุ ฯลฯ พร้อมกับดัชนีเชิงพื้นที่สำหรับประมาณ 30 เมกะไบต์
นี่คือต้นแบบที่ไม่แน่นอนที่มี quadrangles มากกว่า 8 ล้านและรูปแบบการแบ่ง multires บน i3 ที่มี GF 8400 (นี่คือเมื่อหลายปีก่อน) มันเร็วกว่ารุ่นที่ไม่เปลี่ยนรูปของฉัน แต่ไม่ได้ใช้ในการผลิตเนื่องจากฉันพบว่าเวอร์ชันที่ไม่เปลี่ยนรูปได้ง่ายกว่ามากในการดูแลรักษาและประสิทธิภาพในการทำงานก็ไม่เลวร้ายนัก โปรดทราบว่าโครงลวดไม่ได้บ่งบอกถึง facets แต่ patch (สายเป็นเส้นโค้งจริงมิฉะนั้นตาข่ายทั้งหมดจะเป็นสีดำทึบ) แม้ว่าจุดทั้งหมดใน facet จะถูกแก้ไขโดยแปรง
ดังนั้นฉันก็แค่อยากจะแสดงบางอย่างข้างต้นเพื่อแสดงตัวอย่างที่เป็นรูปธรรมและพื้นที่ที่การจัดการหน่วยความจำมีประโยชน์มากและหวังว่าผู้คนจะไม่คิดว่าฉันแค่พูดถึงก้นของฉัน ฉันมักจะหงุดหงิดนิดหน่อยเมื่อมีคนบอกว่าหน่วยความจำมีมากและราคาถูกเพราะนั่นคือการพูดถึงหน่วยความจำช้าเช่น DRAM และฮาร์ดไดรฟ์ มันยังเล็กและมีค่ามากเมื่อเราพูดถึงหน่วยความจำที่รวดเร็วและประสิทธิภาพสำหรับเส้นทางที่สำคัญอย่างแท้จริง (เช่นกรณีทั่วไปไม่ใช่สำหรับทุกสิ่ง) เกี่ยวข้องกับการเล่นกับหน่วยความจำที่รวดเร็วจำนวนเล็กน้อยและใช้มันอย่างมีประสิทธิภาพเท่าที่เราจะทำได้ .
สำหรับประเภทของสิ่งนี้เป็นประโยชน์จริง ๆ ในการทำงานกับภาษาที่ช่วยให้คุณสามารถออกแบบวัตถุระดับสูงเช่น C ++ ในขณะที่ยังสามารถเก็บวัตถุเหล่านี้ในอาร์เรย์ที่ต่อเนื่องกันตั้งแต่หนึ่งตัวขึ้นไปด้วยการรับประกันว่าหน่วยความจำของ วัตถุดังกล่าวทั้งหมดจะถูกนำเสนออย่างต่อเนื่องและไม่มีค่าใช้จ่ายหน่วยความจำที่ไม่จำเป็นต่อวัตถุ (เช่น: วัตถุทั้งหมดไม่จำเป็นต้องมีการสะท้อนหรือการจัดส่งเสมือน) เมื่อคุณย้ายเข้าสู่พื้นที่สำคัญด้านประสิทธิภาพจริง ๆ แล้วมันจะเพิ่มประสิทธิภาพการทำงานเพื่อให้มีการควบคุมหน่วยความจำเช่นพูดเล่นกับกลุ่มวัตถุและใช้ชนิดข้อมูลดั้งเดิมเพื่อหลีกเลี่ยงค่าใช้จ่ายวัตถุต้นทุน GC และการเข้าถึงหน่วยความจำบ่อยครั้ง ติดกัน
ดังนั้นการจัดการหน่วยความจำ / การควบคุม (หรือขาดมัน) เป็นเหตุผลที่มีอิทธิพลเหนือกว่าในกรณีของฉันสำหรับการเลือกภาษาที่มีประสิทธิภาพมากที่สุดช่วยให้ฉันสามารถจัดการกับปัญหา ฉันจะเขียนส่วนแบ่งของรหัสซึ่งไม่สำคัญต่อประสิทธิภาพและแน่นอนว่าฉันมักจะใช้ Lua ซึ่งง่ายต่อการฝังจาก C