บทวิจารณ์สมัยใหม่ของ Java [ปิด]


58

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

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

ฉันต้องการที่จะได้รับความคิดเห็นวัตถุประสงค์ของ Java เป็นภาษาวันนี้ ดังนั้นคำถามของฉันมี 4 ส่วน

  1. ประสิทธิภาพ.

    วันนี้ความเร็วของ Java เปรียบเทียบกับ C ++ อย่างไร

    ข เป็นไปได้ไหมที่จะสร้างชื่อ AAA ที่ทันสมัยโดยใช้ Java?

    ค Java ช้ากว่า C ++ เป็นพิเศษในด้านใดบ้าง? (เช่นการบีบตัวเลขกราฟิกหรืออื่น ๆ )

  2. ตอนนี้ Java ถือเป็นภาษาที่รวบรวมหรือแปลภาษาหรือไม่?

  3. อะไรคือข้อบกพร่องที่สำคัญของ Java ที่ได้รับการแก้ไขตั้งแต่ต้น?

  4. อะไรคือข้อบกพร่องที่สำคัญของ Java ที่ยังไม่ได้รับการแก้ไข?

แก้ไข:

เพื่อความชัดเจนฉันไม่ได้ทำ Java vs C ++ นี้โดยเฉลี่ย c ++ จะเร็วกว่า Java เล็กน้อย ฉันต้องการบางสิ่งบางอย่างเพื่อเปรียบเทียบ Java ในแง่ของวุฒิภาวะเป็นภาษา ณ เวลานี้ ตั้งแต่ c ++ มีมาโดยตลอดฉันคิดว่าฉันจะเป็นจุดเปรียบเทียบที่ดี



4
ฉันชอบความจริงที่ว่าบางสิ่งที่อายุ 10 ปีไม่ทันสมัย
cwallenpoole

4
Java ดูเหมือนแตกต่างกันมากเมื่อคุณดูเป็นกรอบ / แพลตฟอร์มแทนที่จะเป็นภาษา อาจเป็นปัญหาได้ว่าชื่อนี้มีชื่อว่า "Java" สำหรับทั้งคู่
Joe Internet

1
Minecraft เปรียบได้กับยอดขาย 3 ล้านจุด ฉันไม่คิดว่าข้อบกพร่องที่กล่าวหาของ Java ได้ทำร้ายเกมมากพอที่จะส่งผลกระทบต่อยอดขาย
Michael K

3
อย่างใด ภาษาจะด้อยกว่า "ในทางใดทางหนึ่ง" ตามคำจำกัดความ
SK-logic

คำตอบ:


62

วันนี้ความเร็วของ Java เปรียบเทียบกับ C ++ อย่างไร

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

อย่างไรก็ตามสิ่งที่ฉันจะพูดคือ Java GC ต้องทำงานได้อย่างรวดเร็วในทุกสถานการณ์ อย่างไรก็ตามการปันส่วนแบบเนทีฟสามารถถูกสลับเป็นค่าที่เหมาะสมกว่าได้ ฉันเพิ่งถามคำถามเกี่ยวกับSOว่าทำไม C # Dictionaryสามารถทำงานใน (0.45 ms บนเครื่องของฉัน) เมื่อเทียบกับเทียบเท่าstd::unordered_mapซึ่งทำงานบน (10ms บนเครื่องของฉัน) อย่างไรก็ตามโดยการแลกเปลี่ยนตัวจัดสรรและแฮ็กสำหรับตัวที่เหมาะสมกว่าฉันจะลดเวลาการดำเนินการนั้นเป็น 0.34 มิลลิวินาทีบนเครื่องของฉันซึ่งเท่ากับสามสิบปีของการทำงานเดิม คุณไม่เคยคาดหวังว่าจะทำการปรับให้เหมาะสมแบบนั้นกับ Java ตัวอย่างที่ดีของสิ่งที่สามารถสร้างความแตกต่างที่แท้จริงคือเกลียว ไลบรารีเธรดดั้งเดิมเช่น TBB มีตัวจัดสรรเธรดการแคชซึ่งเร็วกว่าตัวจัดสรรแบบดั้งเดิมอย่างมากเมื่อจัดการกับการจัดสรรจำนวนมากในหลายเธรด

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

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

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

ข เป็นไปได้ไหมที่จะสร้างชื่อ AAA ที่ทันสมัยโดยใช้ Java?

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

ค Java ช้ากว่า C ++ เป็นพิเศษในด้านใดบ้าง? (เช่นการบีบตัวเลขกราฟิกหรืออื่น ๆ )

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

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

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

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

พื้นฐานความหมายของ Java บอกว่ามันเป็นภาษาที่ช้ากว่า C ++

ตอนนี้ Java ถือเป็นภาษาที่รวบรวมหรือแปลภาษาหรือไม่?

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

อะไรคือข้อบกพร่องที่สำคัญของ Java ที่ได้รับการแก้ไขตั้งแต่ต้น?

มวยอัตโนมัติและ unboxing เป็นสิ่งเดียวที่ฉันรู้ ยาชื่อสามัญแก้ปัญหาบางอย่างแต่ห่างไกลจากหลาย ๆ

อะไรคือข้อบกพร่องที่สำคัญของ Java ที่ยังไม่ได้รับการแก้ไข?

ยาชื่อสามัญของพวกเขาอ่อนแอมาก ๆ ข้อมูลทั่วไปของ C # นั้นแข็งแกร่งกว่ามาก - ถึงแม้ว่าจะไม่มีเทมเพลตเลยทีเดียว การทำลายล้างตามกำหนดเป็นอีกหนึ่งการขาดที่สำคัญ รูปแบบของแลมบ์ดา / การปิดใด ๆ ก็เป็นปัญหาที่สำคัญเช่นกันคุณสามารถลืม API ที่ใช้งานได้ใน Java และแน่นอนว่ายังมีปัญหาเรื่องประสิทธิภาพอยู่เสมอสำหรับพื้นที่เหล่านั้นที่ต้องการ


10
คุณดูเหมือนจะมีความเข้าใจผิดเกี่ยวกับการทำงานของ JIT ที่ทันสมัย ข้อมูลที่ดีอย่างอื่น
Sean McMillan

7
"ที่สำคัญกว่านั้นมีเพียงสองระบบที่มีการจัดการที่สำคัญคือ JVM และ CLR" - เอ่อ Python? ทับทิม? หูฟัง? LISP ? พวกเขาทั้งหมดใช้ตัวรวบรวมขยะการขาดตัวชี้ทางคณิตศาสตร์และ AFAIK มีการนำไปใช้อย่างน้อยหนึ่งครั้งตาม bytecode
Michael Borgwardt

3
@Michael: ครั้งสุดท้ายที่ฉันตรวจสอบอย่างน้อย Python และ Ruby ตกลงอย่างหนักในค่าย "ตีความ" การใช้งานที่พบบ่อยที่สุดของพวกเขานั้นไม่ได้รวบรวม bytecode ล่วงหน้าในระยะที่แยกจากกันและไม่รวมถึง JIT ไม่ได้ใช้ Smalltalk หรือ LISP แต่ฉันไม่แน่ใจว่าจะนำพวกเขาไปยังค่าย "สำคัญ" และฉันไม่เคยได้ยินชื่อของ Smalltalk หรือ LISP JIT มาก่อน
DeadMG

19
+1 คำตอบที่ดี ในที่สุดคนที่เข้าใจว่าทำไม Java จะช้ากว่า C ++ เสมอ
jeffythedragonslayer

2
ข้อใดข้อหนึ่งเหล่านี้แสดงถึงปัญหาประสิทธิภาพในโลกแห่งความเป็นจริง (accexdotal หรือ benchmarked)? ผู้ใช้ส่วนใหญ่เป็นที่สะดุดตาหรือไม่? การพูดภาษา X เร็วกว่าภาษา Y 0.25% ไม่ได้แปลว่าภาษา Y นั้นช้า เมื่อใช้วิดีโอเกมคุณกำลังพูดถึงคอนโซลที่มีความแรงหรือมีเกมพีซีอยู่ด้วยหรือไม่?
TheLQ

34

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

1a ความเร็ว: ความเร็วที่คุณได้รับจาก C ++ หรือ Java โดยทั่วไปจะขึ้นอยู่กับภาษาหรือการใช้งานน้อยกว่าทักษะของโปรแกรมเมอร์ที่ใช้งาน ท้ายที่สุด, C ++ อาจจะสามารถชนะสำหรับความเร็วบ่อยกว่าไม่ได้ แต่ความแตกต่างในรหัสที่คุณเขียนเป็นสิ่งที่จริงเรื่อง
1b ใช่อาจจะ ในขณะเดียวกัน C ++ ก็เป็นที่ยอมรับอยู่แล้วและฉันสงสัยว่าสตูดิโอเกมส่วนใหญ่เห็นว่ามีประโยชน์มากพอที่จะเปลี่ยนมาใช้จาวา
1c คำตอบที่ละเอียดถี่ถ้วนเกี่ยวกับเรื่องนี้อาจเติมได้ในปริมาณมาก C ++ โดยทั่วไปจะทำได้ดีกว่าด้วยทรัพยากรที่ จำกัด มากขึ้น Java ได้ประโยชน์มากขึ้นจาก (ตัวอย่าง) การมีหน่วยความจำ "สำรองไว้" จำนวนมาก
2. การดำเนินการช้าและการรวบรวมขยะช้าอาจเป็นสองสิ่งที่ชัดเจนที่สุด ห้องสมุดหน้าต่างแรก (AWT) ค่อนข้างซุ่มซ่าม - Swing เป็นการปรับปรุงที่สำคัญ
3. การใช้คำฟุ่มเฟื่อย ขาดผู้ประกอบการมากไป ใช้การเก็บขยะ ขาดการสืบทอดหลายอย่าง Java Generics มีข้อ จำกัดอย่างมากเมื่อเทียบกับเทมเพลต C ++

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


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

10
+1 สำหรับคำฟุ่มเฟื่อย มันอยู่ที่นั่นกับ COBOL สำหรับไวยากรณ์ที่ไม่มีความหมายยืดยาว ด้วยการลองทั้งหมด "ลอง" "และด้วย ht e ทั้งหมด ExtrementlyLongClassName อย่างยิ่ง longongbbNameName = new ExteremlyLongClassName () รหัสประเภทใหม่อาจเป็นความท้าทายในการหาว่าส่วนใดของรหัสที่พยายามจะทำจริง ๆ
James Anderson

1
@ Mark: ส่วนตัวฉันพบคำตอบนี้เป็นระเบียบไม่สามารถอ่านได้และต้องการที่จะไม่เห็นสิ่งนี้อีกครั้ง คำตอบควรเป็นคำตอบไม่ใช่การสนทนา
Michael Borgwardt

2
+1 สำหรับผู้ปฏิบัติงานมากไปบางสิ่งที่หลายคนเห็นว่าเป็นข้อเสียเล็ก ๆ น้อย ๆ แต่สำหรับฉันเป็นคนสำคัญ และแน่นอนแม่แบบ แต่เกือบทุกคนถือว่าพวกเขาเป็นวิชาเอก
Christian Rau

2
เทมเพลต C ++ นั้นไม่ได้มีเจตนาที่จะทำให้ทัวริงสมบูรณ์ซึ่งเกิดขึ้นโดยบังเอิญเนื่องจากการออกแบบ อย่างไรก็ตามมันมีประโยชน์ในบางครั้ง: ค้นหาเมตาแกรมการเขียนโปรแกรม C ++
Comingstorm

11
  1. เกี่ยวกับประสิทธิภาพ
    1. ในความเร็วในการเรียกใช้โค้ดบริสุทธิ์ Java นั้นมีค่าเท่ากับ C ++ ที่ไม่ซับซ้อน แต่ Java มีแนวโน้มที่จะใช้หน่วยความจำมากขึ้นส่วนหนึ่งเป็นเพราะใช้ GC บางส่วนเนื่องจากการออกแบบให้ความสำคัญกับความเรียบง่ายและความปลอดภัยมากกว่าประสิทธิภาพ เนื่องจากปัญหาแคชหน่วยความจำเพิ่มเติมแปลเป็นความเร็วต่ำ จำนวนมากที่ต่ำกว่าเมื่อเทียบกับการปรับสูง C ++
    2. หากคุณคิดว่าชื่อ AAA จะต้องใช้งานได้ในสิ่งที่เป็นไปได้โดยใช้ฮาร์ดแวร์ปัจจุบันไม่ใช่ อย่างน้อยไม่ได้อยู่ฝั่งลูกค้า ฉันยินดีที่จะเดิมพันว่าหนังสือ AAA บางเล่มใช้ Java เป็นส่วนหนึ่งของโครงสร้างพื้นฐานแบ็กเอนด์แล้ว
    3. ทุกสิ่งที่คุณทำงานกับชุดข้อมูลขนาดใหญ่และ C ++ สามารถปรับให้เหมาะสมเพื่อเข้าถึงชุดข้อมูลเหล่านั้นในลักษณะที่เป็นมิตรกับแคช
  2. มันถูกรวบรวมเพื่อ bytecode และ JIT- รวบรวมที่รันไทม์ รวบรวมกับการตีความเป็นเท็จขั้วคู่ที่ล้าสมัย
  3. & 4. มีหลายสิ่งมากเกินกว่าที่จะบันทึกรายการทั้งหมดและจะมีการไม่เห็นด้วยกับส่วนใหญ่

3
การพูดว่า Java ใช้หน่วยความจำจำนวนมากเพราะมันใช้ GC เป็นเหมือนการบอกว่า18 ล้อใช้แก๊สเยอะเพราะมันมี 18 ล้อ ฉันรู้ว่าไม่มีอะไรเกี่ยวกับ Java แต่ฉันสงสัยว่าปัญหาคือการขยายตัวของรันไทม์และมีหลายสิ่งมากเกินไปที่จะถูกแคชขยะที่มีความหมายน้อยและไม่มีข้อบกพร่องในแนวทางการรวบรวมขยะเอง
Joey Adams

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

1
@MichaelBorgwardt คุณอาจต้องการพูดถึงว่าความเร็วต้องใช้เวลาเพราะ JVM ส่วนใหญ่ต้องเริ่มต้นจากศูนย์ทุกครั้ง ข้อมูลการทำโปรไฟล์จากการรันครั้งก่อนจะไม่ถูกนำมาใช้ซ้ำ

11

ประการแรกบริบทของฉัน C ++ ของฉันเป็นสนิมมากดังนั้นประสบการณ์ของฉันกับ Java ส่วนใหญ่เกี่ยวข้องกับประสบการณ์ล่าสุดของฉันกับ C # ซึ่งเป็นแอปเปิ้ลมากขึ้นเพื่อเปรียบเทียบแอปเปิ้ลต่อไป

1. ความเร็ว

วันนี้ความเร็วของ Java เปรียบเทียบกับ C ++ อย่างไร

ฉันคิดว่านี่เป็นคำตอบที่ดีที่สุดโดยคำถาม SO เหตุใดจาวามีชื่อเสียงว่าเป็นคนช้า แต่ฉันยังคิดว่าคำถามทั้งหมดนี้เป็นสีโดยการโพสต์บล็อก Jeff Atwood ของกอริลลากับฉลาม ขอบคุณPéter & Christopher

ข เป็นไปได้ไหมที่จะสร้างชื่อ AAA ที่ทันสมัยโดยใช้ Java?

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

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

ค Java ช้ากว่า C ++ เป็นพิเศษในด้านใดบ้าง? (เช่นการบีบตัวเลขกราฟิกหรืออื่น ๆ )

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

ด้วยพลังอันยิ่งใหญ่มาพร้อมความรับผิดชอบที่ยิ่งใหญ่ตามที่พวกเขาพูด (ไม่พูดถึงความสามารถในการทำให้กองของคุณสมบูรณ์ * 8 ')

2. ตอนนี้ Java ถือเป็นภาษาที่แปลหรือแปลภาษาหรือไม่?

ฉันไม่สามารถพูดได้ว่าคนส่วนใหญ่คิดว่ามันเป็นอย่างไร แต่หลายคนรู้ถึงความแตกต่างระหว่างภาษาที่แปลและตีความและไม่ได้อาศัยอยู่ในถ้ำในช่วง 20 ปีที่ผ่านมาก็จะรู้ว่า JIT ( Just-in - เวลา ) คอมไพเลอร์เป็นส่วนสำคัญของระบบนิเวศ Java ดังนั้นจึงมีแนวโน้มที่จะถูกรวบรวมในวันนี้

3. อะไรคือข้อบกพร่องที่สำคัญของ Java ที่ได้รับการแก้ไขตั้งแต่ต้น?

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

4. อะไรคือข้อบกพร่องที่สำคัญของ Java ที่ยังไม่ได้รับการกล่าวถึง?

ในใจของฉันปัญหาหนึ่งของ Java คือการใช้คุณสมบัติใหม่ ๆ ช้า

เมื่อมาถึง Java จาก C # และมองผ่านหน้าการเปรียบเทียบของ Wikipediaนี่คือสิ่งที่โดดเด่นสำหรับฉัน:

สิ่งที่ฉันคิดถึงใน Java เมื่อเทียบกับ C #

  • คุณสมบัติโดยเฉพาะคุณสมบัติอัตโนมัติ พวกเขาทำให้การสร้างและรักษาอินเตอร์เฟซมากได้ง่ายขึ้น
  • ปิด / lambdas ผมผิดหวังจริงๆเมื่อผมได้ยินมาว่าการสนับสนุน Java ถูกผลักดันให้กลับมาอีกครั้ง ในที่สุดเราก็มี Closures / lambdas ใน Java 8 แต่เวลาที่ใช้ในการยืนยันของฉันเกี่ยวกับการยอมรับช้า
  • การอนุมานประเภท ( var) อาจดูเหมือนน้ำตาลประโยค แต่เมื่อคุณมีประเภททั่วไปที่ซับซ้อนก็สามารถทำให้รหัสชัดเจนมากขึ้นโดยการลบการทำซ้ำที่ไร้ค่าจำนวนมาก
  • คลาสบางส่วนช่วยให้โค้ดที่สร้างขึ้นโดยอัตโนมัติ (พูดจากตัวสร้าง GUI) แยกจากโค้ดที่เขียนโดยโปรแกรมเมอร์
  • ประเภทค่าบางครั้งมีข้อโต้แย้งในการใช้น้ำหนักเบาstructในคลาสเต็ม
  • วิธีการขยายสามารถทำให้ระบบมีความซับซ้อนได้ถ้าใช้ไป แต่เป็นวิธีที่ดีในการระบุวิธีการใช้งานมาตรฐานสำหรับชั้นเรียนหากจำเป็น
  • ประเภทที่ไม่ได้ลงนามบางครั้งบิตพิเศษสามารถสร้างความแตกต่างได้ * 8)

สิ่งที่ฉันไม่ควรพลาดใน Java เมื่อเทียบกับ C #

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

ดังนั้นแม้ว่าจะเปรียบเทียบแอปเปิ้ลกับแอปเปิ้ลแล้วก็ตาม Java ถือว่าถูกทิ้งไว้ข้างหลัง

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


1
ดังนั้นคำถามที่คุณเชื่อมโยงคำตอบที่ยอมรับนั้นผิดพลาดอย่างไม่น่าเชื่อ
DeadMG

ไม่ฉันหมายถึงstackoverflow.com/questions/2163411/…
DeadMG

@ Mark: บางที จากนั้นอีกครั้งอาจเป็นไปได้ที่จะวางลงอย่างสมบูรณ์ ฉันได้พูดไปแล้วในคำตอบของฉันเองสำหรับคำถามเดียวกันดังนั้นการเพิ่มความคิดเห็นเพิ่มเติมจึงไม่น่าจะเพิ่มความรู้ใหม่ ๆ มากมาย
Jerry Coffin

8

ฉันสามารถชี้แหล่งที่มาที่อาจช่วยตอบคำถามแรกของคุณให้คุณ ภาษาการเขียนโปรแกรมยิงออกมาhttp://shootout.alioth.debian.org/u64q/which-programming-languages-are-fastest.phpเป็นแหล่งที่ดีมากที่จะเห็นว่าภาษาที่รวดเร็วเมื่อเทียบกับคนอื่น ๆ พวกเขายังสามารถกรองตามหมวดหมู่ที่แตกต่างกันเพื่อดูว่าภาษาในพื้นที่ใดที่ทำได้ดีกว่าภาษาอื่น ๆ Java นั้นเร็วกว่าเมื่อหลายปีก่อนมาก



ใช่ฉันอาจจะต้องเชื่อมโยงตรงไปยังหน้านั้นขอโทษ
bschaffer13

4

1) พูดอย่างเคร่งครัดเกี่ยวกับ UX ที่ฉันได้รับด้วย Java มันรู้สึกช้า ฉันไม่สามารถบอกคุณได้ว่าทำไม ฉันยังไม่เจอแอพพลิเคชั่นบนเดสก์ท็อปที่มาจาก Java ซึ่งไม่รู้สึกช้าและมีทางเลือกที่ไม่ใช่จาวาที่เร็วกว่า ที่ถูกกล่าวว่า Java ได้อย่างรวดเร็วในการคำนวณความเร็วบริสุทธิ์และอินเทอร์เน็ตที่เต็มไปด้วยมาตรฐานเพื่อพิสูจน์ว่า อย่างไรก็ตามเวลาบู๊ตของแอพ Java และการตอบสนองของ GUI นั้นยังไม่ได้ปรับปรุง IMHO บางทีคุณสามารถทำได้;)
ในที่สุดความเร็วไม่ได้เป็นปัญหามากนัก ไม่เพียง แต่ฮาร์ดแวร์จะเริ่มเร็วขึ้นและเร็วขึ้นแล้วมันยังเป็นสิ่งที่คนส่วนใหญ่ยังให้ความสนใจน้อยมากตราบใดที่ซอฟต์แวร์ทำสิ่งที่ควรทำและอัตราส่วนเวลาที่ใช้ในการโต้ตอบกับเวลาที่รอนั้นสมเหตุสมผล

2) ความแตกต่างนี้ได้กลายเป็นพร่ามัวเมื่อเร็ว ๆ นี้ว่ามีค่าน้อยจริงๆ

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

มันเป็นเรื่องของการตั้งค่า

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

พูดง่ายๆคือนี่เป็นเรื่องของความชอบ

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

ฉันเห็น `การแข่งขัน 'กำลังเปลี่ยน" Hello world "ไปทางซ้ายและหยุดตรงนั้น
- Steve Gonedes

Java เลือกที่จะไม่เสนอการบรรทุกเกินพิกัดด้วยเหตุผลอย่างนั้น แน่นอนว่าสิ่งนี้จะช่วยป้องกันไม่ให้ผู้คนสับสนกับรหัสของพวกเขาโดยการคูณตัวชี้ฟังก์ชันพร้อมด้วยรายการ แต่ในขณะเดียวกันก็ป้องกันไม่ให้ผู้อื่นทำการคำนวณทางเรขาคณิต / พีชคณิตกับผู้ประกอบการปกติ (v1 * v2 / scale) + (v3 * m)มีความชัดเจนมากกว่าv1.multiply(v2).divide(scale).add(v3.multiply(m))จริงๆ ฉันเห็นว่าทำไมสิ่งนี้จึงทำให้คนที่จัดการกับกราฟิก 3 มิติและการคำนวณลดลง

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

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

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


+1 ด้วยความจริงที่ว่าใน C ++ ไม่มีอะไรป้องกันคุณจากการเขียนโค้ดที่เหมือน Java และไม่มีอะไรที่จะป้องกันคุณจากการทำมากกว่านั้น เป็นโปรแกรมเมอร์ที่ทำให้ภาษาไม่ปลอดภัยหรือยาก
Christian Rau

0

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

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


นักสะสมขยะสมัยใหม่ส่วนใหญ่ไม่หยุดโลก

-1

3) ข้อบกพร่องที่ได้รับการแก้ไข

ไม่กี่ปีที่ผ่านมามีความโกรธที่ Java เป็นจำนวนมาก โปรแกรมเมอร์ Java ส่วนใหญ่เป็นโปรแกรมเมอร์เว็บ / เซิร์ฟเวอร์และพวกเขาคลั่งไคล้กับ Java ดังนั้นบางภาษาอย่าง Ruby จึงเป็นที่นิยมและ Java เริ่มจางหายไป อย่างไรก็ตามด้วยคำอธิบายประกอบและเฟรมเวิร์กใหม่เช่น hibernate และ Spring ผู้คนหยุดบ่นและกลับไปที่ Java

4) ข้อบกพร่องในปัจจุบัน

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


1
จะบ้า? คิดไม่ถึง และเห็นได้ชัดว่าคุณยังไม่ได้ดูสิ่งที่เกิดขึ้นพร้อมกันใน Java 6

-1

ฉันตอบสนองต่อคำถามนี้เพราะมันจะให้คำตอบที่ทำให้เข้าใจผิดและส่วนใหญ่ไม่เกี่ยวข้อง:

ข เป็นไปได้ไหมที่จะสร้างชื่อ AAA ที่ทันสมัยโดยใช้ Java?

ทุกคนสามารถยอมรับว่าชื่อ AAA นั้นยากที่จะผลิตโดยใช้ Java และไม่มีตัวอย่างจริงที่ฉันทราบ อย่างไรก็ตามเนื่องจากลักษณะของ AAA ที่จะมีหลายสิ่งหลายอย่าง (เนื่องจากเป็นคำที่สับสนที่มาจากการตลาด) ดังนั้นจึงควรถามสิ่งต่อไปนี้แทน:

เป็นไปได้ไหมที่จะสร้างชื่อที่ทันสมัยพร้อมความสำเร็จที่สมเหตุสมผลโดยใช้ Java?

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


-6

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

แต่มีบางสิ่งที่ภาษาจาวา จำกัด การทำงานของตัวเอง

  1. การจัดสรรในกอง Java ทำสิ่งนี้ไม่ได้ สำหรับคลาสที่มีขนาดคงที่ขนาดเล็กในโซลูชันที่ไม่เกิดซ้ำมักเป็นวิธีที่เหมาะสมที่สุด คุณยังสามารถหลีกเลี่ยงการกระจายตัวของกอง

  2. ฟังก์ชั่นที่ไม่ใช่เสมือน Java ทำสิ่งนี้ไม่ได้ การเรียกใช้เมธอดทั้งหมดจะได้รับผลกระทบถาวรแม้ว่าจะไม่ได้วางแผนว่าจะถูกแทนที่

อาจเป็นสิ่งอื่น ๆ แต่นั่นคือทั้งหมดที่ฉันสามารถคิดออกไปด้านบนของหัวของฉัน


2
คอมไพเลอร์ JIT ที่ทันสมัยสามารถเพิ่มประสิทธิภาพทั้งสองกรณีนี้ Java ( ณ วันที่ 6) ได้จัดสรรสแต็ค: en.wikipedia.org/wiki/Escape_analysis สำหรับฟังก์ชั่นที่ไม่ใช่เสมือนคอมไพเลอร์ JIT จะแก้ปัญหาการเรียกเมธอดเสมือนที่ไปที่ปลายทางเดียวเท่านั้น (และบางครั้งก็สามารถอินไลน์ได้) ในการโทรที่ไม่ใช่เสมือน
Steven Schlansker

1
# 2 เป็นของปลอม: JIT ที่เหมาะสมจะทำหน้าที่เป็นเสมือนหรือไม่เสมือนโดยขึ้นอยู่กับว่าพวกเขากำลังถูกแทนที่อยู่หรือไม่
amara

-16

1) ไม่เกี่ยวข้องและการโต้แย้งในการบูต
ไม่เพียง แต่จะสร้างซอฟต์แวร์ที่สำคัญใน Java เท่านั้นระบบดังกล่าวจะถูกจัดส่งทุกวันและดำเนินการกับ บริษัท ยักษ์ใหญ่ในโลกในขณะนี้
2) เหมือนกัน
อ่านข้อกำหนด JVM แล้วคุณก็รู้ Java ไม่เคยแปลภาษา
3) เหมือนกัน
อ่านบันทึกประจำรุ่น 15 ปี เป็นไปไม่ได้ที่เราจะคิดออกว่าคุณคิดว่า "ข้อบกพร่องหลัก" จะได้รับการแก้ไขอย่างไร
4) เหมือนกัน
ข้อบกพร่องที่สำคัญที่ต้องกล่าวถึงคือ JCP ซึ่งมีแนวโน้มที่จะเข้าไปยุ่งกับภาษาหลักและห้องสมุดโดยไม่มีเหตุผลอื่นที่ชัดเจนกว่าที่จะได้ชื่อของ somoene ใน JSR เพื่อให้พวกเขาสามารถเขียนหนังสือที่มีการประกาศว่า "พวกเขาเป็น ผู้นำของ JSR-666 " หวังว่าการปรับโครงสร้าง JCP ของออราเคิลจะดูแลสิ่งนั้น
ดูเหมือนว่าคุณต้องการปลุกเร้าสงครามภาษาที่นี่และทำให้อคติของคุณกับ Java ได้รับการยืนยันจากผู้อื่นเพราะคุณไม่สามารถหาเหตุผลที่แท้จริงได้ด้วยตัวคุณเอง


อ่าฉันเห็นผู้คนเริ่มสงครามแล้วโดยการโค่นล้มใครก็ตามที่ไม่ได้ถล่ม Java ทำได้ดีมากผู้คน!
jwenting

10
ฉันคิดว่าเหตุผลของการลงคะแนนคือความจริงที่ว่าคำตอบของคุณไม่ใช่คำตอบเดียว
blubb

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

4
OP เขียนคำถามที่รวบรวมได้ค่อนข้างดีและได้รับคำตอบที่เป็นประโยคที่ดี ไม่จำเป็นต้องกล่าวหาว่าเขากวนอะไรเลย
อดัมเลียร์

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