คำถามติดแท็ก memory-usage

15
เมื่อใดจึงควรปรับให้เหมาะสมสำหรับหน่วยความจำและประสิทธิภาพความเร็วสำหรับวิธีการ?
ฉันเพิ่งสัมภาษณ์ที่อเมซอน ในระหว่างเซสชันการเข้ารหัสผู้สัมภาษณ์ถามว่าทำไมฉันถึงประกาศตัวแปรในวิธีหนึ่ง ฉันอธิบายกระบวนการของฉันและเขาท้าทายให้ฉันแก้ปัญหาเดียวกันโดยมีตัวแปรน้อยลง ยกตัวอย่างเช่น (นี่คือไม่ได้มาจากการสัมภาษณ์) ผมเริ่มต้นด้วยวิธี A:แล้วดีขึ้นก็จะวิธีการ Bint sโดยการเอา เขายินดีและกล่าวว่าวิธีนี้จะลดการใช้หน่วยความจำด้วยวิธีนี้ ฉันเข้าใจตรรกะเบื้องหลัง แต่คำถามของฉันคือ: เมื่อใดจึงเหมาะสมที่จะใช้วิธี A กับวิธี B และในทางกลับกัน คุณจะเห็นว่าA วิธีการที่เป็นไปได้ใช้หน่วยความจำที่สูงขึ้นเนื่องจากint sมีการประกาศ a + bแต่มันเท่านั้นที่มีการดำเนินการอย่างใดอย่างหนึ่งในการคำนวณคือ ในทางกลับกันวิธีการ Bมีการใช้หน่วยความจำลดลง แต่ต้องทำการคำนวณa + bสองครั้งคือสองครั้ง ฉันจะใช้เทคนิคหนึ่งเหนือเทคนิคอื่นได้อย่างไร หรือเป็นหนึ่งในเทคนิคที่ต้องการมากกว่าเสมอ? สิ่งที่ต้องพิจารณาเมื่อประเมินทั้งสองวิธีมีอะไรบ้าง วิธี A: private bool IsSumInRange(int a, int b) { int s = a + b; if (s > 1000 …

8
หากฉันต้องการใช้หน่วยความจำตลอดอายุการใช้งานของโปรแกรมฉันจำเป็นต้องเพิ่มจำนวนหน่วยความจำก่อนที่จะสิ้นสุดโปรแกรมหรือไม่?
ในหนังสือและแบบฝึกหัดหลายเล่มฉันเคยได้ยินการฝึกฝนการจัดการความจำและรู้สึกว่าสิ่งลึกลับและน่ากลัวบางอย่างจะเกิดขึ้นถ้าฉันไม่ได้ใช้หน่วยความจำฟรีหลังจากที่ฉันใช้งานเสร็จแล้ว ฉันไม่สามารถพูดสำหรับระบบอื่น ๆ (ถึงฉันมันก็สมเหตุสมผลที่จะสมมติว่าพวกเขาใช้แนวทางปฏิบัติที่คล้ายกัน) แต่อย่างน้อยใน Windows เคอร์เนลรับประกันโดยทั่วไปว่าจะล้างทรัพยากรส่วนใหญ่ (ยกเว้นข้อผิดพลาดเล็กน้อย) ที่ใช้โดย โปรแกรมหลังจากสิ้นสุดโปรแกรม ซึ่งรวมถึงหน่วยความจำฮีปท่ามกลางสิ่งอื่น ๆ อีกมากมาย ฉันเข้าใจว่าทำไมคุณต้องการปิดไฟล์หลังจากใช้งานเสร็จแล้วเพื่อให้ผู้ใช้สามารถใช้งานได้หรือทำไมคุณต้องการยกเลิกการเชื่อมต่อซ็อกเก็ตที่เชื่อมต่อกับเซิร์ฟเวอร์เพื่อประหยัดแบนด์วิดท์ แต่ดูเหมือนว่าโง่ ต้อง micromanage ทุกหน่วยความจำของคุณใช้โดยโปรแกรมของคุณ ตอนนี้ฉันยอมรับว่าคำถามนี้กว้างเนื่องจากวิธีที่คุณควรจัดการหน่วยความจำของคุณขึ้นอยู่กับจำนวนหน่วยความจำที่คุณต้องการและเมื่อคุณต้องการดังนั้นฉันจะ จำกัด ขอบเขตของคำถามนี้ให้แคบลง: หากฉันต้องการใช้ชิ้นส่วนของ หน่วยความจำตลอดอายุการใช้งานของโปรแกรมมันจำเป็นหรือไม่ที่จะปล่อยให้ถูกต้องก่อนสิ้นสุดโปรแกรม? แก้ไข: คำถามที่แนะนำว่าซ้ำซ้อนเป็นคำถามเฉพาะของตระกูล Unix ของระบบปฏิบัติการ คำตอบอันดับแรกของมันยังระบุเครื่องมือเฉพาะสำหรับ Linux (เช่น Valgrind) คำถามนี้มีขึ้นเพื่อครอบคลุมระบบปฏิบัติการที่ "ไม่ธรรมดา" ส่วนใหญ่และทำไมจึงเป็นหรือไม่ใช่แนวปฏิบัติที่ดีในการเพิ่มหน่วยความจำที่จำเป็นตลอดอายุการใช้งานของโปรแกรม

10
อะไรคือจุดใช้ของรายการเหนือเวคเตอร์ใน C ++?
ฉันใช้การทดลอง 3 แบบที่เกี่ยวข้องกับรายการ C ++ และเวกเตอร์ ผู้ที่มีเวกเตอร์พิสูจน์ได้ว่ามีประสิทธิภาพมากขึ้นแม้ว่าจะมีการแทรกอยู่ตรงกลางจำนวนมาก ดังนั้นคำถาม: ในกรณีใดรายการที่มีเหตุผลมากกว่าเวคเตอร์? หากเวกเตอร์ดูเหมือนจะมีประสิทธิภาพมากขึ้นในกรณีส่วนใหญ่และพิจารณาว่าสมาชิกของพวกเขาเหมือนกันแล้วจะมีข้อได้เปรียบอะไรที่เหลืออยู่สำหรับรายการ? สร้างจำนวนเต็ม N และวางไว้ในคอนเทนเนอร์เพื่อให้คอนเทนเนอร์ยังคงเรียงลำดับ การแทรกได้รับการดำเนินการอย่างไร้เดียงสาโดยการอ่านองค์ประกอบทีละหนึ่งและแทรกใหม่ขวาก่อนที่จะมีขนาดใหญ่ขึ้นครั้งแรก ด้วยรายการเวลาจะผ่านหลังคาเมื่อมิติเพิ่มขึ้นเมื่อเทียบกับเวกเตอร์ แทรกจำนวนเต็ม N ที่ส่วนท้ายของคอนเทนเนอร์ สำหรับรายการและเวกเตอร์เวลาเพิ่มขึ้นตามลำดับความสำคัญเท่ากันแม้ว่ามันจะเร็วขึ้น 3 เท่าเมื่อใช้เวกเตอร์ แทรกจำนวนเต็ม N ในคอนเทนเนอร์ เริ่มจับเวลา เรียงลำดับคอนเทนเนอร์โดยใช้ list.sort สำหรับรายการและ std :: sort สำหรับเวกเตอร์ หยุดจับเวลา อีกครั้งเวลาเพิ่มขึ้นตามลำดับความสำคัญเท่ากัน แต่มันจะเร็วขึ้นโดยเฉลี่ย 5 เท่าด้วยเวกเตอร์ ฉันอาจทำการทดสอบต่อไปและหาตัวอย่างสองสามข้อที่รายการจะพิสูจน์ได้ดีขึ้น แต่ประสบการณ์ร่วมกันของพวกคุณที่อ่านข้อความนี้อาจให้คำตอบที่มีประสิทธิผลมากขึ้น คุณอาจเจอสถานการณ์ที่รายการใช้งานได้สะดวกกว่าหรือทำได้ดีกว่า

1
ปริมาณการใช้หน่วยความจำ Redux [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัพเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Software Engineering Stack Exchange ปิดให้บริการใน3 ปีที่ผ่านมา กรอบ Redux สนับสนุนกระบวนทัศน์ของฟังก์ชันบริสุทธิ์ / ไม่เปลี่ยนรูปแบบซึ่งส่งเสริมการสร้างสถานะใหม่จากสถานะก่อนหน้าในแง่ของการกระทำในปัจจุบัน การบังคับใช้กระบวนทัศน์นี้ไม่อาจปฏิเสธได้ ข้อกังวลหลักของฉันคือเนื่องจาก Redux reducers ส่งคืนสถานะใหม่ที่สดใหม่จากสถานะก่อนหน้าสำหรับการกระทำทุกครั้งที่เรียกใช้หน่วยความจำขนาดใหญ่ที่ระบายออก (เพื่อไม่ให้สับสนกับการรั่วไหลของหน่วยความจำ) จะกลายเป็นเรื่องธรรมดา . เมื่อพิจารณาว่าแอปพลิเคชัน Javascript ทำงานตามปกติในเบราว์เซอร์ในอุปกรณ์ของผู้ใช้โดยเฉลี่ยซึ่งอาจใช้งานแอพพลิเคชั่นเฉพาะอุปกรณ์อื่น ๆ รวมถึงแท็บและหน้าต่างเบราว์เซอร์อื่น ๆ อีกมากมายความจำเป็นในการอนุรักษ์หน่วยความจำ มีใครเปรียบเทียบการใช้หน่วยความจำของแอพพลิเคชัน Redux กับสถาปัตยกรรม Flux แบบดั้งเดิมบ้างไหม ถ้าเป็นเช่นนั้นพวกเขาสามารถแบ่งปันสิ่งที่ค้นพบของพวกเขา?

4
การใช้สแต็คมีมากเกินไปมากเกินไป?
เมื่อเร็ว ๆ นี้เมื่อฉันเขียน C หรือ C ++ ฉันจะประกาศตัวแปรทั้งหมดของฉันในสแต็คเพียงเพราะเป็นตัวเลือกซึ่งแตกต่างจาก Java อย่างไรก็ตามฉันได้ยินมาว่าเป็นความคิดที่ดีที่จะประกาศเรื่องใหญ่ ๆ ในกองซ้อน ทำไมเป็นกรณีนี้ ฉันคิดว่าสแต็กล้นมีส่วนเกี่ยวข้อง แต่ฉันไม่ชัดเจนว่าทำไมจึงเกิดขึ้น สแต็คมีมากน้อยเพียงใด? ฉันไม่ได้พยายามที่จะวางไฟล์ 100MB ในสแต็กเพียงหนึ่งโหลกิโลไบต์อาร์เรย์เพื่อใช้เป็นบัฟเฟอร์สตริงหรืออะไรก็ตาม มีการใช้งานสแต็กมากเกินไปหรือไม่ (ขออภัยหากซ้ำกันการค้นหาสแต็กยังคงให้การอ้างอิงถึงสแต็คโอเวอร์โฟลไม่มีแม้แต่สแต็กแท็กการโทรฉันเพิ่งใช้นามธรรมหนึ่ง)

6
การจัดเรียงหน่วยความจำมีความสำคัญแค่ไหน? มันยังคงเป็นเรื่องสำคัญหรือไม่
จากช่วงเวลานี้ฉันได้ค้นหาและอ่านมากเกี่ยวกับการจัดตำแหน่งหน่วยความจำวิธีการทำงานและวิธีการใช้งาน บทความที่เกี่ยวข้องมากที่สุดที่ฉันได้พบในขณะนี้คือคนนี้ แต่ถึงอย่างนั้นฉันก็ยังมีคำถามบางอย่างเกี่ยวกับเรื่องนี้: ออกจากระบบฝังตัวเรามักจะมีหน่วยความจำขนาดใหญ่ในคอมพิวเตอร์ของเราที่ทำให้การจัดการหน่วยความจำน้อยลงมากฉันทำการปรับให้เหมาะสม แต่ตอนนี้มันเป็นสิ่งที่สามารถสร้างความแตกต่างได้ถ้าเราเปรียบเทียบโปรแกรมเดียวกันกับหรือ ไม่มีหน่วยความจำที่จัดเรียงใหม่และจัดตำแหน่ง? การจัดตำแหน่งหน่วยความจำมีข้อดีอื่น ๆ หรือไม่? ฉันอ่านบางแห่งว่า CPU ทำงานได้ดีขึ้น / เร็วขึ้นด้วยหน่วยความจำที่จัดเรียงเพราะใช้คำสั่งในการประมวลผลน้อยกว่า (หากคุณมีลิงค์สำหรับบทความ / เกณฑ์มาตรฐานเกี่ยวกับเรื่องนี้?) ในกรณีนี้ มีข้อดีมากกว่าสองอย่างนี้ไหม? ในลิงค์บทความที่บทที่ 5 ผู้เขียนพูดว่า: ระวัง: ใน C ++ คลาสที่ดูเหมือนว่า structs อาจผิดกฎนี้! (ไม่ว่าพวกเขาจะทำหรือไม่ขึ้นอยู่กับว่าคลาสพื้นฐานและฟังก์ชั่นสมาชิกเสมือนมีการใช้งานอย่างไรและแตกต่างกันตามคอมไพเลอร์) บทความส่วนใหญ่พูดคุยเกี่ยวกับโครงสร้าง แต่การประกาศตัวแปรท้องถิ่นได้รับผลกระทบจากความต้องการนี้เช่นกัน? คุณเคยคิดบ้างไหมว่าการจัดเรียงหน่วยความจำทำงานอย่างไรใน C ++ เนื่องจากดูเหมือนว่าจะมีความแตกต่างบ้างไหม? คำถามเดิมนี้มีคำว่า "การจัดตำแหน่ง" แต่ไม่ได้ให้คำตอบสำหรับคำถามข้างต้น

5
มีข้อเสียเปรียบในการจัดสรรสแต็กจำนวนมากสำหรับอาร์เรย์เดียวในระบบฝังตัวหรือไม่?
ฉันมักจะไม่มีปัญหาในการตัดสินใจว่าข้อมูลบางอย่างจะต้องเป็นแบบโกลบอลสแตติกหรือบนสแต็ก (ไม่มีการจัดสรรแบบไดนามิกที่นี่ดังนั้นจึงไม่มีการใช้ฮีป) ฉันได้อ่านคำถามสองสามข้อเช่นคำถามนี้แต่คำถามของฉันเฉพาะเจาะจงมากขึ้นเพราะมันเกี่ยวข้องกับข้อมูลจำนวนมากมากเมื่อเทียบกับหน่วยความจำระบบ ฉันกำลังใช้งานโค้ดที่มีอยู่ซึ่งฉันพยายามปรับปรุง (ออกแบบปัญหาที่เป็นไปได้การแสดง ฯลฯ ) รหัสนี้วิ่งบน MCU 8bit เก่ามีเพียง4KB ของแรม ในรหัสนี้ฉันต้องเผชิญกับการใช้งานของอาร์เรย์เกือบ 1KB (ใช่1KB ในระบบRAM 4KB ) แต่ละไบต์ของอาร์เรย์นี้ถูกใช้นั่นไม่ใช่คำถาม ปัญหาคือว่าอาร์เรย์นี้เป็นอาร์เรย์แบบคงที่ในไฟล์ที่มีการประกาศดังนั้นวงจรชีวิตของมันเป็นเช่นเดียวกับโปรแกรมหนึ่ง (เช่นถือได้ว่าไม่มีที่สิ้นสุด) อย่างไรก็ตามหลังจากอ่านโค้ดฉันเพิ่งค้นพบว่าอาเรย์นี้ไม่จำเป็นต้องมีวงจรชีวิตที่ไม่มีที่สิ้นสุดมันถูกสร้างและจัดการด้วยวิธีการที่สมบูรณ์ดังนั้นเราควรจะสามารถประกาศได้เฉพาะในฟังก์ชั่นที่ใช้ วิธีนี้มันจะอยู่ในสแต็คและเราจะบันทึก 1KB ของ RAM นี้ ทีนี้คำถาม: นี่เป็นความคิดที่ดีไหม? จากมุมมองการออกแบบหากไม่ต้องการวงจรชีวิตที่ไม่มีที่สิ้นสุด / ทั่วโลกมันเป็นของสแต็ค แต่เดี๋ยวก่อนนั่นคือ 1KB จาก 4KB ไม่มีข้อเสียในการจัดสรร RAM 25% ของแบบนี้ใช่ไหม? (นั่นอาจเป็น 50% หรือมากกว่าของสแต็ก) ใครบางคนสามารถแบ่งปันประสบการณ์บางอย่างกับสถานการณ์แบบนี้หรือใครบางคนคิดเกี่ยวกับเหตุผลที่ถูกต้องที่จะไม่วางอาร์เรย์นี้ในกอง? ฉันกำลังมองหาข้อเสียทางเทคนิคเช่นเดียวกับความคิดเห็นในการออกแบบ สิ่งเดียวที่ฉันใส่ใจคือฉันต้องทำให้แน่ใจว่าจริง ๆ แล้วฉันมีสแต็ก 1KB ฟรีเมื่อเข้าสู่ฟังก์ชันนี้ …

4
ทำไมไม่ใช้รหัสปลอดภัยที่ไม่มีการจัดการใน C #
มีตัวเลือกใน C # เพื่อเรียกใช้งานโค้ดที่ไม่ได้ตรวจสอบ โดยทั่วไปไม่แนะนำให้ทำเช่นนั้นเนื่องจากรหัสที่ได้รับการจัดการนั้นปลอดภัยกว่าและสามารถเอาชนะปัญหาได้มากมาย อย่างไรก็ตามฉันสงสัยว่าถ้าคุณแน่ใจว่ารหัสของคุณจะไม่ทำให้เกิดข้อผิดพลาดและคุณรู้วิธีจัดการหน่วยความจำแล้วทำไม (ถ้าคุณชอบรหัสเร็ว) ทำตามคำแนะนำทั่วไป? ฉันสงสัยเรื่องนี้ตั้งแต่ฉันเขียนโปรแกรมสำหรับกล้องวิดีโอซึ่งต้องการการจัดการบิตแมปที่รวดเร็วมาก ฉันสร้างอัลกอริทึมแบบกราฟิกที่รวดเร็วด้วยตัวเองและมันทำงานได้ดีบนบิตแมปโดยใช้โค้ดที่ไม่มีการจัดการ ตอนนี้ฉันสงสัยโดยทั่วไปแล้วถ้าคุณแน่ใจว่าคุณไม่มีการรั่วไหลของหน่วยความจำหรือความเสี่ยงของการขัดข้องทำไมไม่ใช้รหัสที่ไม่มีการจัดการบ่อยขึ้น ป.ล. ภูมิหลังของฉัน: ฉันรู้สึกเข้าสู่โลกแห่งการเขียนโปรแกรมและฉันทำงานคนเดียว (ฉันทำมาสองสามปี) และดังนั้นฉันหวังว่าคำถามการออกแบบซอฟต์แวร์นี้จะไม่แปลก ฉันไม่ได้มีคนอื่นที่นั่นเหมือนครูที่จะถามสิ่งนั้น

1
ฉันจะปรับปรุงการใช้หน่วยความจำของแอปพลิเคชันของฉันได้อย่างไร [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว ฉันกำลังเขียนแอปพลิเคชัน C # และสามารถเห็นการใช้หน่วยความจำเพิ่มขึ้นเมื่อเวลาทำงานของแอปพลิเคชันเพิ่มขึ้น มีเครื่องมือหรือเทคนิคใดบ้างที่ฉันสามารถตรวจสอบการใช้หน่วยความจำของแอปพลิเคชันของฉันระบุการรั่วไหลของหน่วยความจำและปรับปรุงการใช้หน่วยความจำของแอปพลิเคชันของฉันโดยทั่วไปหรือไม่
10 c#  memory-usage 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.