ทำไมทีมที่ LMAX ใช้จาวาและออกแบบสถาปัตยกรรมเพื่อหลีกเลี่ยง GC ในทุกกรณี?


24

ทำไมทีมที่ LMAX จึงออกแบบLMAX Disruptorใน Java แต่ทุกจุดของการออกแบบเพื่อลดการใช้งาน GC หากไม่มีใครต้องการให้ GC ทำงานแล้วทำไมต้องใช้ภาษาที่รวบรวมขยะ?

การเพิ่มประสิทธิภาพระดับความรู้ด้านฮาร์ดแวร์และความคิดของพวกเขานั้นยอดเยี่ยม แต่ทำไม Java

ฉันไม่ได้ต่อต้าน Java หรืออะไร แต่ทำไมเป็นภาษา GC ทำไมไม่ใช้สิ่งที่ต้องการ D หรือภาษาอื่นที่ไม่มี GC แต่ให้โค้ดที่มีประสิทธิภาพ? เป็นทีมที่คุ้นเคยกับ Java มากที่สุดหรือ Java นั้นมีข้อได้เปรียบที่ไม่เหมือนใครหรือไม่?

สมมติว่าพวกเขาพัฒนาโดยใช้ D พร้อมการจัดการหน่วยความจำด้วยตนเองสิ่งที่แตกต่างกันคืออะไร พวกเขาจะต้องคิดในระดับต่ำ (ซึ่งพวกเขาเป็นอยู่แล้ว) แต่พวกเขาสามารถบีบประสิทธิภาพที่ดีที่สุดออกมาจากระบบเหมือนเป็นเจ้าของภาษา


6
ฉันรู้น้อยมากเกี่ยวกับโครงการนี้ แต่ดูเหมือนว่าเป็นกรอบบางชนิดที่คนอื่นสามารถสร้างได้ และถ้าคุณจัดการที่จะเขียนใน Java (และอนุญาตให้ผู้อื่นรหัสใน Java และเก็บเกี่ยวผลประโยชน์) แล้วคุณจะมี "ฐานลูกค้า" มากขึ้นกว่าที่คุณจะเขียนใน D.
Joachim Sauer

6
@kadaj: มันไม่สำคัญว่าผู้บริโภคจะเป็นสาธารณะหรือภายใน: ถ้าคุณทำให้มันสามารถเข้าถึงได้ในภาษาที่รู้จักกันอย่างแพร่หลายมันจะมีประโยชน์มากขึ้นแม้จะมีการพัฒนาภายใน หากคุณเริ่มการโต้แย้งของคุณด้วย: "สมมติว่าทุกคนรู้จัก D และพวกเขารู้จัก Java, ... " คุณก็อาจพลาดอะไรบางอย่างไป
Joachim Sauer

6
บางคนชอบใช้ค้อนสำหรับปัญหาทุกประเภท มีขอบที่ขรุขระที่คุณต้องการออกไปทุบด้วยค้อนของคุณจนเรียบ มีสกรูที่คุณต้องการขับเข้าทุบด้วยค้อนจนกระทั่งเข้ามามีเครื่องประดับที่ละเอียดอ่อนที่คุณต้องการขัดลงทุบด้วยค้อนแล้วตำหนิเครื่องประดับสำหรับ "ดูด" C หรือ C ++ น่าจะเป็นทางเลือกที่ดีกว่า D ถ้าเฉพาะฐานความรู้ที่มีอยู่ ไม่แน่ใจว่าทำไมคุณถึงนำ D มาเป็นตัวอย่าง TBH
gbjbaanb

2
@gbjbaanb ฉันพูดถึง D เพราะมันมีการรวบรวมขยะ (ในกรณีที่ abstractions ระดับสูงมีความจำเป็นและเล่นกับหน่วยความจำยากเกินไปสำหรับสมอง) แต่ยังช่วยให้การจัดการหน่วยความจำด้วยตนเองด้วยสไตล์ malloc C และฟรี D นั้นคล้ายกับ Objective-C ที่มี ARC (ไม่มี GC จริง) แต่ดีกว่านั้น แต่ใช่ C / C ++ จะพอดีกับใบเสร็จ

4
@kadaj ฉันเห็นว่าคุณได้รับความเสียหายที่นี่เพื่อนำขึ้น D แต่ฉันอยากจะบอกว่าฉันผิดหวังในน้ำเสียงที่คนอื่นใช้และคิดออกว่าทำไมฉันถึงคิดว่า D เป็นคำถามสำคัญในมือ ในขณะที่ D ไม่ได้ใช้กันอย่างแพร่หลาย D ให้การสร้างระดับสูงบางอย่างที่ฉันคาดหวังว่าจะพบในการพูด Java หรือ C # แต่ไม่ได้อยู่ใน (อย่างน้อยแบบเก่า) C ++ มันยังคงให้การผสมผสานที่มีการจัดการและไม่มีการจัดการ - ซึ่งเป็นเพียงภาษาเดียวที่ฉันรู้ว่าจะทำ! ดังนั้น D ไม่ได้เป็นเพียงตัวเลือกสัตว์เลี้ยง แต่เป็นสิ่งที่มีเป้าหมายที่สอดคล้องกับคำถามดั้งเดิมรอบ GC
J Trana

คำตอบ:


20

เนื่องจากมีความแตกต่างอย่างมากระหว่างการเพิ่มประสิทธิภาพและปิดความปลอดภัยอย่างสมบูรณ์

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

  1. ลดจำนวนของวัตถุที่ย้ายไปยังพื้นที่ผู้รอดชีวิต (เช่นรอดชีวิตอย่างน้อยหนึ่งชุดเก็บขยะ) โดยใช้วัตถุขนาดเล็กที่ถูกโยนทิ้ง วัตถุที่ย้ายไปยังพื้นที่ผู้รอดชีวิตนั้นยากที่จะรวบรวมและการรวบรวมขยะที่นี่บางครั้งก็บ่งบอกถึงการแช่แข็ง JVM ทั้งหมด
  2. อย่าจัดสรรวัตถุมากเกินไปที่จะเริ่มต้นด้วย สิ่งนี้สามารถย้อนกลับมาได้หากคุณไม่ระวังเนื่องจากวัตถุรุ่นใหม่นั้นราคาถูกสุด ๆ ในการจัดสรรและรวบรวม
  3. ตรวจสอบให้แน่ใจว่าวัตถุใหม่ชี้ไปที่วัตถุเก่า (ไม่ใช่ทางอื่น ๆ ) เพื่อให้วัตถุเล็ก ๆ นั้นง่ายต่อการรวบรวมเนื่องจากไม่มีการอ้างอิงถึงวัตถุเหล่านั้นที่จะทำให้พวกมันถูกเก็บไว้

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


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


แต่มันแย่ลงไปอีก

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

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


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

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

แต่แล้ว D โดยเฉพาะเกี่ยวกับอะไร? คุณมี GC หากคุณต้องการมุมมืดและชุดย่อย SafeD (ที่ฉันไม่ทราบมาก่อนการแก้ไข) ลบพฤติกรรมที่ไม่ได้กำหนด (ถ้าคุณจำได้ว่าจะใช้มัน!)

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

ดังนั้นประเด็นสุดท้ายของฉันยังคงอยู่: หากคุณต้องการหลีกเลี่ยงปัญหาที่เกิดจากผลกระทบร้ายแรงให้ยึดติดกับตัวเลือกที่ปลอดภัย ณ จุดนี้ในชีวิตของ D ลูกค้าของมันคือการเริ่มต้นเล็ก ๆ น้อย ๆ พร้อมที่จะรับความเสี่ยงอย่างบ้าคลั่ง หากมีปัญหาสามารถค่าใช้จ่ายนับล้านคุณจะดีกว่าการเข้าพักต่อไปในโค้งนวัตกรรมระฆัง


2
โพสต์ต้นฉบับนั้นเรียกว่า D. โดยเฉพาะจริงๆแล้วมันมีความแตกต่างอย่างมากระหว่าง C ++ และ D เกี่ยวกับความละเอียดที่เลือก แม้ว่าคุณจะเลือกที่จะจัดการเต็มรูปแบบในชุดย่อย SafeD ฉันคิดว่าคุณได้รับการควบคุมมากขึ้นเล็กน้อยในบางแง่มุมของการรวบรวมและการกำหนดเวลา (เปิด / ปิดใช้งานรวบรวมลดให้น้อยที่สุด) ตรวจสอบกลยุทธ์ของ Digital Mars สำหรับการจัดการหน่วยความจำ!
J Trana

2
ขั้นตอนด้านความปลอดภัยที่ Java มอบให้อย่างรอบคอบ
James

นี่จะเป็นคำตอบที่ยอดเยี่ยมยกเว้น Java ไม่ได้รับอนุญาตสำหรับซอฟต์แวร์ที่มีความสำคัญต่อภารกิจ หากคุณมีเครื่องปฏิกรณ์นิวเคลียร์มันจะเขียนด้วยภาษา C ++ ไม่ใช่ Java ซึ่งเป็นสิ่งที่ทำให้เกิด "ความปลอดภัย" ทั้งหมด
gbjbaanb

@gbjbaanb [จำเป็นต้องมี] มาตรฐาน / แนวทางความน่าเชื่อถือที่ฉันได้เห็นแนะนำก่อนหลีกเลี่ยง C / C ++ ในความโปรดปรานของภาษาอื่น ๆ ; และหากเข้าสู่พวกเขาให้ใช้ภาษาที่ จำกัด อย่างมาก (MISRA ฯลฯ ) และเมื่อคุณยอมรับข้อ จำกัด ฉันไม่เห็นว่าทำไมคุณไม่สามารถทำแบบเดียวกันกับภาษาอื่นได้ หากคุณกำลังคิดเกี่ยวกับ Java Licence ที่กล่าวถึง "ไม่ใช่สำหรับโรงงานนิวเคลียร์" ในส่วนข้อ จำกัด ดูเหมือนว่าจะมีการเปลี่ยนแปลงเมื่อเวลาผ่านไปและตอนนี้แทนที่จะพูดว่า "ระวังไม่ใช่ความรับผิดชอบของเรา" ถึงกระนั้นฉันก็ถือว่า (... )
hmijail

(... ) ถ้อยคำดั้งเดิมนั้นเหมือนกับใบอนุญาตของ gcc และ clang: ไม่มีการรับประกันสำหรับวัตถุประสงค์เฉพาะใด ๆ ดังนั้นคุณจะไม่ใช้มันสำหรับบางสิ่งที่ต้องการความน่าเชื่อถือและคุณจะต้องใช้คอมไพเลอร์ที่ผ่านการรับรองถ้าคุณไม่ใช้ภาษาเฉพาะสำหรับงาน (Ada?)
hmijail

4

ดูเหมือนเหตุผลที่เขียนใน Java คือพวกเขามีความเชี่ยวชาญ Java ในบ้านและมันอาจจะเขียน (แม้ว่าจะยังอยู่ในการพัฒนาที่ใช้งานอยู่) ก่อน C ++ ได้กระทำร่วมกับ C ++ 0x / 11

รหัสของพวกเขาคือ Java จริงๆโดยใช้ชื่อพวกเขาใช้ sun.misc.Unsafe ไม่กี่ชนิดที่เอาชนะจุดของ Java และความปลอดภัยที่ควรจะให้ ฉันได้เขียนพอร์ต C ++ ของ Disruptor และมันมีประสิทธิภาพสูงกว่าโค้ด Java ที่พวกเขาจัดส่ง (ฉันไม่ได้ใช้เวลาปรับจูน JVM มาก)

ที่กล่าวว่าหลักการที่ผู้ทำลายระบบดังต่อไปนี้ไม่ใช่ภาษาที่เฉพาะเจาะจงเช่นอย่าคาดหวังว่ารหัส C ++ แฝงต่ำที่ allocs หรือปลดปล่อยจากฮีป


คุณสามารถชี้ไปที่การนำไปใช้ของคุณได้หรือไม่? ฉันเห็นการใช้งานซ้ำสองครั้งมากกว่าที่อ้างว่ามีประสิทธิภาพสูงกว่า แต่ทั้งคู่โกงด้วยความเรียบง่าย: ตัวอย่างเช่นการเดินสายผู้ผลิต 1 ราย + ผู้บริโภค 1 รายแทนที่จะเป็นผู้ผลิตหลายราย / ผู้บริโภคที่มีความสามารถเช่น Disruptor ดั้งเดิม ผู้เขียน Disruptor เองกล่าวถึงในกลุ่ม Google Groups ว่าสามารถปรับปรุงประสิทธิภาพโดยพารามิเตอร์การเดินสายในรุ่น Java
hmijail

4

คำถามนี้ระบุหลักฐานที่ไม่ถูกต้องตามความเป็นจริงแล้วทำให้มีการโต้แย้งเกี่ยวกับหลักฐานที่ไม่ถูกต้องนั้น

ให้ขุดลงไปนี้ .. "จุดการออกแบบทั้งหมดเพื่อลดการใช้งาน GC" - ไม่จริง นวัตกรรมในตัวทำลายมีส่วนเกี่ยวข้องกับ GC เพียงเล็กน้อย ตัวขัดขวางทำงานได้เนื่องจากการออกแบบได้พิจารณาอย่างชาญฉลาดว่าคอมพิวเตอร์สมัยใหม่ทำงานอย่างไร - บางสิ่งที่พบได้น้อยกว่าที่คาดไว้มาก ดูการพูดคุยของคลิฟคลิกhttp://www.azulsystems.com/events/javaone_2009/session/2009_J1_HardwareCrashCourse.pdfสำหรับการสนทนา

มันเป็นที่รู้จักกันดีว่า LMax เป็นลูกค้าของ Azul ฉันรู้โดยตรงว่าด้วย Azul GCs นั้นไม่ใช่แบบธรรมดา - แม้จะมีขนาด 175GB


มีความจริงเกี่ยวกับเรื่องนี้ พวกเขารีสตาร์ท VM ทุกคืนเพื่อหลีกเลี่ยงการรวบรวมที่สำคัญ นั่นคือสิ่งที่มาร์ตินฟาวเลอร์เขียนไว้และเขาก็ไม่ได้หลอกว่า: "เหมือนกับระบบอื่น ๆ ผู้ทำลายถูกเด้งข้ามคืนการเด้งนี้ทำเพื่อล้างความทรงจำส่วนใหญ่เพื่อให้มีโอกาสน้อยลงในการเก็บขยะราคาแพงระหว่างการซื้อขาย" martinfowler.com/articles/lmax.html
JimmyJames

2
ไม่มาก เราเคยเรียกใช้ GC เองทุกคืนในช่องว่างการซื้อขาย 5 นาทีและปรับเพื่อให้เป็น GC ที่สำคัญเพียงหนึ่งเดียวในหนึ่งวัน นั่นกลายเป็นสิ่งที่ซ้ำซ้อนกับ Azul Zing (ที่มา: ฉันทำงานที่ LMAX จนกระทั่งเมื่อเร็ว ๆ นี้)
ทอมจอห์นสัน

@TomJohnson Love รับ scoop ด้านใน คุณกำลังบอกว่าคำอธิบายของ Martin Fowler ผิดหรือเปล่า? เป็นไปได้หรือไม่ที่โซลูชันจะพัฒนาตลอดเวลา?
JimmyJames

2
ฉันกำลังบอกว่าเขาไม่ถูกต้องในรายละเอียดเล็กน้อยบางอย่าง เราไม่เคยเด้งระบบของเราทุกวัน แต่เราทำการล้างข้อมูลสิ้นวัน
Tom Johnson

3

พวกเขาจะต้องคิดในระดับต่ำ

ด้านบนทำให้คำตอบครึ่งหนึ่งที่คุณต้องการ คุณสามารถหาเหตุผลอีกครึ่งหนึ่งให้เสร็จสมบูรณ์โดยไม่มีเหตุผลมากไปกว่าในบล็อก LMAX :

ในขณะที่มีประสิทธิภาพมากมันสามารถนำไปสู่ข้อผิดพลาดได้หลายอย่างเนื่องจากง่ายต่อการผิดพลาด ...

เป็นที่ยอมรับโดยนักพัฒนา LMAX รหัสเช่นนั้นอาจค่อนข้างยากที่จะพัฒนาทำความเข้าใจและแก้ไขปัญหา - แม้ใน Java การก้าวไปสู่ระดับที่ต่ำกว่าที่ตอนนี้จะทำให้ปัญหานี้รุนแรงขึ้นดังที่ได้กล่าวไว้ในบทความ Wikipedia เกี่ยวกับภาษาการเขียนโปรแกรมระดับต่ำ :

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

โดยการเปรียบเทียบภาษาการเขียนโปรแกรมระดับสูงจะแยกซีแมนติกการประมวลผลของสถาปัตยกรรมคอมพิวเตอร์ออกจากข้อกำหนดของโปรแกรมซึ่งทำให้การพัฒนาง่ายขึ้น ...


3

หากคุณใช้ Java เป็นภาษาไวยากรณ์และหลีกเลี่ยงไลบรารี JDK มันจะเร็วเท่ากับภาษาที่ไม่ใช่ GC ที่คอมไพล์ GC ไม่เหมาะสำหรับระบบเรียลไทม์ แต่เป็นไปได้ที่จะพัฒนาระบบใน Java ที่ไม่ทิ้งขยะใด ๆ ไว้ข้างหลัง ด้วยเหตุนี้ GC จึงไม่เรียกใช้

เราเชื่อว่าภาษาจาวาและแพลตฟอร์มมีข้อได้เปรียบเหนือ C / C ++ และเราได้พัฒนาและเปรียบเทียบส่วนประกอบของ Java ที่มีความหน่วงต่ำพิเศษเพื่อพิสูจน์มัน เราพูดคุยเกี่ยวกับเทคนิคในการทำเช่นนั้นในบทความนี้: การพัฒนา Java โดยไม่ต้อง GC


2
มีตัวรวบรวมขยะที่เหมาะสมกับระบบเรียลไทม์ ตัวรวบรวมเริ่มต้นของ JVM อาจไม่ได้ แต่นั่นไม่ได้หมายความว่า GC โดยทั่วไปไม่เหมาะสมสำหรับเรียลไทม์ แต่ธรรมดาmalloc/freeไม่เหมาะสำหรับเรียลไทม์เช่นกันเนื่องจากเวลาการจัดสรรไม่ได้ จำกัด เนื่องจากการกระจายตัว
Doval

1
เราสนับสนุนการใช้กลุ่มวัตถุที่รวดเร็วสำหรับทุกสิ่งดังนั้นจึงไม่มีการจัดสรรเกิดขึ้นหลังจากอุ่นเครื่อง
rdalmeida

2

LMAX เป็นห้องสมุดส่งข้อความระหว่างเธรดประสิทธิภาพสูง

เพื่อให้มีประโยชน์คนอื่นต้องเขียนโค้ดเพื่อให้แต่ละเธรดทำงานมีประโยชน์ ระบุว่ารหัสมีแนวโน้มที่จะเป็น Java หรือ C # แล้วมีภาษาให้เลือกน้อยมากที่อินเตอร์เฟสกับพวกเขาได้ดี

การใช้ C หรือ C ++ นั้นไม่ใช่ตัวเลือกที่ดียกเว้นว่าคุณต้องการ จำกัด ผู้ใช้ของคุณให้อยู่ในระบบปฏิบัติการเดียวเนื่องจากไม่มีรูปแบบเธรดที่กำหนดไว้ในนั้น

Java เป็นมาตรฐานสำหรับการพัฒนาซอฟต์แวร์จำนวนมากในทุกวันนี้ดังนั้นหากคุณไม่มีเหตุผลที่ดีไม่เช่นนั้นก็มีแนวโน้มที่จะเป็นทางเลือกที่ดีที่สุด (เมื่ออยู่ในกรุงโรมทำในฐานะชาวโรมัน…)

การเขียนซอฟต์แวร์ประสิทธิภาพสูงใน Java (หรือ C #) มักจะทำเพื่อพิสูจน์จุด ...


1
มาตรฐาน C ++ 11 ใหม่รองรับมัลติเธรด ...
Casey

@Casey และคอมไพเลอร์ C ++ ในโลกแห่งความจริงใช้มันอย่างไร และคอมไพเลอร์เหล่านี้ราคาเท่าไหร่ บางทีในอีก 20 ปีมันจะมีประโยชน์จนกระทั่งคุณไม่สามารถพึ่งพามันได้
เอียน

Disruptor ใช้ sun.misc.Unsafe ไม่มากซึ่งแสดงว่าคุณไม่สามารถเขียนรหัส latency ต่ำใน Java ได้โดยไม่ต้องจุ่มนิ้วเท้าของคุณลงในที่ดิน C
James

3
Gcc รองรับเธรด C ++ และฟรี
James

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