เลือก C ++ หรือ Java สำหรับแอปพลิเคชันที่ต้องการ RAM จำนวนมากใช่ไหม [ปิด]


11

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

ใครสามารถชี้ให้เห็นตัวอย่างที่แท้จริงเกี่ยวกับสิ่งนี้


ฉันไม่คิดว่าภาษามีความสำคัญเท่ากับการเขียนโปรแกรมในกรณีนี้ ภาษาผู้ใหญ่ใด ๆ อาจทำงานได้ขึ้นอยู่กับขนาดของการคำนวณของคุณ มี Javas, C / C ++, แม้แต่ Pythons และ Rubies ที่สามารถเลื่อนเข้าไปในบทบาทนี้ได้ บางคนอาจจะยากกว่าคนอื่น ๆ เพราะฟังดูเหมือนคุณจะต้องมีความมั่นใจอย่างแท้จริงว่าคุณไม่ได้มีความจำรั่ว
Rig

2
หากคุณสามารถได้รับ GB ในราคา $ 7.99 นั่นเป็นปัญหาหรือไม่? Kingston 1GB DDR3
Bo Persson

2
@BoPersson จากประสบการณ์ของฉันคนที่มีปัญหาแบบนั้นเริ่มต้นด้วยการเติมเต็มเมนบอร์ดระดับสูงและบ่นว่าพวกเขาไม่สามารถใส่ได้มากเท่าที่พวกเขาต้องการแล้วฟีดข้อมูลชุดใหญ่พอที่จะจัดการได้แล้วบ่นว่า มันไม่เพียงพอ
AProgrammer

@dsign ในวันนี้ที่คุณจะได้รับมาเธอร์บอร์ดที่ยอมรับหน่วยความจำหลายร้อยกิ๊กในราคาต่ำกว่า 1,000 €ไม่กี่กิ๊กที่ใช้หน่วยความจำไม่หนัก
AProgrammer

1
เห็นด้วยกับส่วนหน่วยความจำราคาถูก สำหรับการพัฒนาฉันอยู่ใน C ++ มาระยะหนึ่งและการเขียนโค้ดที่ดีทำให้การรั่วไหลเป็นปรากฏการณ์ที่เกิดขึ้นไม่บ่อยนัก ตามความเป็นจริงฉันชอบ C ++ มากกว่า java ในเรื่องนั้น
dsign

คำตอบ:


11

หากคุณกำลังพูดคุยเกี่ยวกับโปรแกรมที่ถูกผูกไว้กับผู้ความเครียดข้อ จำกัด ของเครื่องดังกล่าวที่คุณคาดหวังว่าคุณจะทำโปรแกรมเทคนิคที่จะหลีกเลี่ยงการเกินขีด จำกัด เหล่านั้นแล้ว C ++ เป็นวิธีที่จะไป ไม่เพียง แต่ภาษาซีพลัสพลัสจะให้พื้นที่สำหรับการเพิ่มประสิทธิภาพโดยที่ Java ไม่ได้ทำตามที่ Emilio ได้กล่าวเอาไว้ แต่ Garbage-Collector ก็ยังเป็นหน่วยความจำที่ต้องใช้หน่วยความจำมากซึ่งต้องการหน่วยความจำว่างเพิ่มเติมมากมาย

คำตอบสำหรับคำถามนี้: StackOverflow: การรวบรวมขยะจำเป็นต้องใช้หน่วยความจำมากแค่ไหน? วาดภาพที่ค่อนข้างเคร่งขรึม แต่ถึงแม้นักสะสมขยะต้องการหน่วยความจำฟรีที่จะเป็นเพียงเท่าที่หน่วยความจำที่จัดสรร (ซึ่งเป็นสิ่งที่ฉันเคยได้ยิน) นี้ยังคงหมายความว่ากับ Java คุณจะยังคงต้องการหน่วยความจำฟรีมากมาย เพื่อให้ทำงานได้อย่างมีประสิทธิภาพ

ในทางตรงกันข้ามทุกวันนี้เรามักจะซื้อฮาร์ดแวร์ที่มีราคาแพงกว่าแทนที่จะต้องใช้เทคนิคการเขียนโปรแกรมเพื่อหลีกเลี่ยงการเกินขีด จำกัด ของฮาร์ดแวร์ ในกรณีของคุณปัญหา RAM ของคุณจะได้รับการแก้ไขโดยใช้เครื่อง 64 บิตและขว้างโมดูล RAM มากเท่าที่จำเป็น คุณเห็นแล้วว่าค่าใช้จ่ายของฮาร์ดแวร์ไม่มีค่าใช้จ่ายใกล้เคียงกับเวลาในการพัฒนาในโลกที่พัฒนาทุกวันนี้

ฉันคิดว่าคุณควรพิจารณาตัวเลือกนี้อย่างจริงจังและถ้าเป็นไปได้ลองใช้ตัวเลือกนี้กับ Java แทน C ++ เพราะการพัฒนาบางอย่างใน Java นั้นง่ายกว่า C ++ และทำให้คงอยู่ต่อไป


ขอบคุณสำหรับคำตอบ. ฉันเห็นด้วยกับภาพประกอบฮาร์ดแวร์ของคุณ
dsign

หากคุณไม่สนใจเกี่ยวกับโปรแกรมที่หยุดชั่วคราวในขณะที่การรวบรวมข้อมูลขยะทำงานความต้องการหน่วยความจำจะน้อยกว่ามาก

1
ฉันไม่เห็นด้วยกับวรรคสุดท้าย Java ไม่จำเป็นต้องพัฒนาง่ายกว่า C ++ มันจะไม่เหมาะกับฉันหรอกเพราะฉันทำ C ++ และ Java ค่อนข้างน้อยในช่วงห้าหรือหกปีที่ผ่านมา เป็นไปได้ที่จะเขียนโค้ดที่สามารถบำรุงรักษาได้และไม่สามารถลบได้ทั้งใน C ++ และ Java
David Thornley

1
@ DavidThornley ฉันทำ C / C ++ เป็นเวลา 10 ปีและ Java เป็นเวลา 6 ปีขึ้นไป ฉันพบว่า Java ง่ายกว่าในทุกสิ่ง: การทำต้นแบบการพัฒนาการขยายและการบำรุงรักษา แต่ในกรณีใดที่เป็นสิ่งที่มีความคิดเห็นที่จะหมายถึงการทำที่แตกต่างกัน C -: =
Mike Nakis

คุณเคยตั้งโปรแกรมสำหรับโครงการขนาดใหญ่ที่ใช้โปรเซสเซอร์หรือไม่? มีความคิดเห็นอะไรบ้าง?
dsign

7

ปัญหาไม่ได้ใช้ C ++ เนื่องจากเป็น Java และไม่ใช้ Java เนื่องจากเป็น C ++ โดยปกติแล้วคอนเทนเนอร์ C ++ จะถูกนำไปใช้เพื่อหลีกเลี่ยงการแตกแฟรกเมนต์มากเกินไปเหมือนกับที่ Java free store ใช้

แต่ถ้าคุณจัดสรรหน่วยความจำด้วยตัวเองโดยตรงคุณสามารถทำสิ่งที่ Java ไม่อนุญาตให้คุณทำซึ่งอาจส่งผลให้เกิดการแตกแฟรกเมนต์

ทางออกที่เหมาะสม (ใน C ++) คือการใช้คอนเทนเนอร์และตัวชี้สมาร์ทผ่านคลาสตัวจัดสรรที่จัดการการจัดสรรโดยใช้ "plexes" คงที่ (จุดสำคัญที่นี่คือการเขียนคลาสตัวจัดสรรที่ดี) และนี่คือรูปแบบการเขียนโปรแกรมที่ไม่มีส่วนเกี่ยวข้องกับ Java ดังนั้นการเปรียบเทียบใด ๆ จึงไม่มีความหมาย

[แก้ไข] นี่เป็นตัวอย่างที่ล้าสมัย: การ จัดสรรแบบคงที่


ขอบคุณสำหรับคำตอบของคุณ Emilio ฉันตระหนักดีถึงความยืดหยุ่นของ C ++ และรู้สึกอยากเห็นด้วยกับคุณ จากนั้นอีกครั้งฉันต้องการทราบตัวอย่างการใช้งานจริงที่มีเทคนิคที่ใช้เพื่อความสำเร็จ
dsign

@dsign: แก้ไขโพสต์แล้วให้ดูลิงก์
Emilio Garavaglia

1
ฉันใช้เทคนิคเหล่านี้ก่อนหน้านี้ แอพที่มีประสิทธิภาพต่ำมีการเปลี่ยนแปลงตัวจัดสรรเพื่อใช้ชุดของฮีปบล็อกคงที่ ดังนั้นเมื่อคุณต้องการบล็อก 4 ไบต์มันมาจากฮีปที่เก็บบล็อก 4 ไบต์เท่านั้น ถ้าคุณต้องการ 5 ไบต์มันมาจากบล็อกขนาด 8 ไบต์ ฯลฯ ประสิทธิภาพที่เพิ่มขึ้น (สำหรับแอพที่เราจัดสรรอย่างหนัก) นั้นยอดเยี่ยมมาก คุณอาจไม่ได้ผลลัพธ์ที่ดี แต่อาจมีประสิทธิภาพมาก นอกจากนี้ยังมีการแตกแฟรกเมนต์เป็นศูนย์เนื่องจาก allocs ทั้งหมดมาในบล็อกคงที่
gbjbaanb

2

ข้อดีของการรวบรวมขยะคือมันจำลองเครื่องที่มีหน่วยความจำไม่ จำกัด จำนวน กลไกหรือการนำไปปฏิบัติของสิ่งที่เป็นนามธรรมนั้นมีจุดประสงค์เพื่อความโปร่งใสอย่างสมบูรณ์สำหรับคุณในฐานะโปรแกรมเมอร์ เราทุกคนรู้ว่ากลไกกำลังเรียกคืนหน่วยความจำที่ไม่ได้ใช้โดยโปรแกรมอีกต่อไป แต่นั่นไม่ได้รับประกันจริง หากคุณเรียกใช้โปรแกรมบนเครื่องที่มี RAM มากกว่าที่โปรแกรมใช้จริงการรวบรวมขยะอาจไม่เกิดขึ้น อีกครั้งไม่เกี่ยวข้องเพราะคุณสามารถเขียนโปรแกรมโดยไม่คำนึงถึงวิธีการใช้หน่วยความจำ ตัวจัดการหน่วยความจำจะจัดสรร RAM เพิ่มเติมเมื่อใดก็ตามที่โปรแกรมร้องขอและคุณได้รับอนุญาตให้สมมติว่าการจัดสรรดังกล่าวจะประสบความสำเร็จเสมอ Java เป็นภาษาที่รวบรวมขยะและ C ++ ไม่ใช่ 1

ข้อเสียของการรวบรวมขยะก็คือเช่นเดียวกับ abstractions ทั้งหมดมันมีแนวโน้มที่จะรั่วไหล มันไม่ได้ทำงานอย่างสมบูรณ์แบบตลอดเวลาโดยเฉพาะในกรณีที่มีขอบและคุณมีแนวโน้มที่จะพบข้อบกพร่อง คนที่เขียนอัลกอริทึมการรวบรวมขยะ (ที่ควรจะโปร่งใสสำหรับคุณในฐานะโปรแกรมเมอร์) ได้รับการปรับให้เหมาะกับกรณีที่พบบ่อยที่สุดและปัญหาของกรณีทั่วไปก็คือพวกเขาไม่เคยพบเห็นกันทั้งหมด โดยทั่วไปแล้วคุณไม่สามารถทำได้ดีไปกว่าที่ตัวรวบรวมขยะสามารถจัดการหน่วยความจำได้ แต่ในบางสถานการณ์ (และให้เวลาพลังงานและความเข้าใจเพียงพอ) อาจเป็นไปได้ C ++ ช่วยให้คุณมีความยืดหยุ่น Java ไม่ได้

จากทั้งหมดที่กล่าวมาฉันคิดว่าคำแนะนำมาตรฐานสำหรับการเลือกภาษาใช้ที่นี่บางทีอาจจะมากกว่านั้นในกรณีนี้เนื่องจากข้อ จำกัด เลือกภาษาที่ผู้พัฒนาหลักคุ้นเคยที่สุดสำหรับโครงการ นอกเหนือจากเหตุผลที่ชัดเจน (เช่นคุณจะสามารถพัฒนาแอปได้เร็วขึ้นและมีประสิทธิภาพมากขึ้น) นี่เป็นสิ่งพิเศษสำคัญในกรณีที่คุณอธิบายเนื่องจากการเขียนโปรแกรม C ++ เหมือนกับที่คุณกำลังเขียนโปรแกรม Java จะส่งผลให้เกิดแนวทางการจัดการหน่วยความจำที่ไม่มีประสิทธิภาพมากดังนั้นจึงเกิดการรั่วไหลและล้มเหลว การเขียนโปรแกรมแบบจาวาเช่นเดียวกับที่คุณเขียนโปรแกรมใน C ++ จะไม่ทำให้คุณเก่งมากและอาจทำให้การผลิตโปรแกรมน้อยกว่าที่ได้รับการปรับให้เหมาะสมเนื่องจากอัลกอริทึมการรวบรวมขยะถูกปรับแต่งและปรับสำหรับกรณีที่พบบ่อยที่สุด .

โปรแกรมเมอร์ที่ใช้ในการทำงานในภาษาที่เก็บขยะเรียนรู้ที่จะเชื่อถือนักเก็บขยะแทนที่จะต่อสู้กับมัน หากคุณกำลังทำงานในภาษาที่รวบรวมขยะเหล่านี้คือโปรแกรมเมอร์ที่คุณต้องการในโครงการของคุณ โปรแกรมเมอร์ที่ไม่ใช่ใช้ในการทำงานในภาษาที่เก็บขยะมีความสงสัยในสิ่งที่เป็นนามธรรม "หน่วยความจำที่ไม่มีที่สิ้นสุด" และบ่อยครั้งที่มีเหตุผลที่ดีมากมาย ดีเท่าที่โปรแกรมเมอร์เหล่านี้อาจเป็นคนเหล่านี้ไม่ใช่คนที่คุณต้องการทำงานในภาษาที่เก็บขยะเพราะพวกเขาจะต่อสู้กับ GC ทุกขั้นตอนโดยคาดเดาอย่างต่อเนื่องเป็นครั้งที่สองและมักจะผลิตช้าลง รหัสกว่าโปรแกรมเมอร์ประเภทอื่น ๆ ที่ดีที่สุดพวกเขาจะใช้เวลามากในการปรับแต่งล้อทำให้คุณต้องเสียเงินเป็นจำนวนมากและค่าใช้จ่ายในการบำรุงรักษาในระยะยาว

แล้วคุณต้องถามตัวเองด้วยว่ามันสำคัญหรือไม่ มีมากกว่าความจริงในการแสดงความคิดเห็นต่อเรื่องของ Bo: ความทรงจำราคาถูกตอนนี้มันแทบจะไม่คุ้มค่าที่จะเขียนด้วยมือมากเกินไป แม้ว่าคุณจะต้องมีขนาดใหญ่จำนวนเงินจำนวนเงินเหล่านี้จะไม่ได้เกือบเป็นใหญ่ในขณะนี้ขณะที่พวกเขา 10 ปีที่ผ่านมา โปรแกรมเมอร์และนักพัฒนาโปรแกรมอยู่ไกลมีราคาแพงกว่าเพียงแค่การซื้อ gobs of RAM และพลังการประมวลผล นั่นไม่ได้หมายความว่าคุณควรหลีกเลี่ยงเศรษฐกิจหากเป็นไปได้ แต่ก็หมายความว่าคุณไม่ควรเสียเวลาทำเช่นนั้น


1แน่นอนสมมติฐานนี้เน้นข้อบกพร่องที่ลึกกว่าในคำถาม เมื่อปรากฎว่า "Java หรือ C ++" เป็นปลาเฮอริ่งแดงนิดหน่อย การนำ Java มาตรฐานไปใช้นั้นมีการรวบรวมขยะและ C ++ นั้นไม่ได้มาตรฐานตามภาษา แต่ไม่มีเหตุผลใดที่คุณไม่สามารถใช้ตัวรวบรวมขยะบุคคลที่สามสำหรับ C ++ ได้ บริษัท หลายแห่งทำมาหากินขายสิ่งเหล่านี้และบางแห่งอาจทำมาหากินให้ฟรี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.