คุณดูเหมือนจะถามคำถามที่แตกต่างกันสองคำถาม:
- Java ช้าจริงๆหรือไม่และถ้าเป็นเช่นนั้นทำไม
- ทำไม Java จึงรับรู้ช้าแม้ว่าจะเร็วกว่าทางเลือกอื่น ๆ
คำถามแรกคือคำถามที่ "มากแค่ไหน" มันมากับคำจำกัดความของคุณของ "ช้า" เมื่อเทียบกับล่ามล้วนๆ Java นั้นเร็วมาก เมื่อเทียบกับภาษาอื่น ๆ ที่ (ปกติ) เรียบเรียงบางส่วนของ bytecode แล้วรวบรวมแบบไดนามิกกับรหัสเครื่อง (เช่น C # หรือสิ่งอื่น ๆ บน. NET) Java เป็นคร่าว ๆ เมื่อเปรียบเทียบกับภาษาที่คอมไพล์เป็นรหัสเครื่องจริงและมีทีมงาน (มักใหญ่) ที่ทำงานโดยไม่ทำอะไรเลยนอกจากการปรับปรุงเครื่องมือเพิ่มประสิทธิภาพ (เช่น C, C ++, Fortran, Ada) Java ทำได้ค่อนข้างดีในบางสิ่ง แต่โดยรวม อย่างน้อยก็ค่อนข้างช้า
สิ่งนี้เกี่ยวข้องกับการติดตั้งเป็นหลัก - โดยพื้นฐานแล้วผู้ใช้กำลังรอในขณะที่คอมไพเลอร์แบบไดนามิก / JIT ทำงานดังนั้นถ้าคุณไม่มีโปรแกรมที่เริ่มทำงานมาระยะหนึ่งแล้ว ยากที่จะพิสูจน์ว่าการคอมไพเลอร์ใช้เวลากับการปรับแต่งที่ยากลำบาก ดังนั้นคอมไพเลอร์ Java (และ C # ฯลฯ ) ส่วนใหญ่จึงไม่ต้องใช้ความพยายามอย่างมากในการปรับแต่งที่ยากมาก ในหลายกรณีมีน้อยเกี่ยวกับการเพิ่มประสิทธิภาพที่จะเกิดขึ้น ปัญหาการปรับให้เหมาะสมหลายอย่างเสร็จสมบูรณ์แล้ว NP ดังนั้นเวลาที่พวกเขาเติบโตอย่างรวดเร็วด้วยขนาดของปัญหาที่ถูกโจมตี วิธีหนึ่งในการรักษาเวลาด้วยเหตุผลคือการใช้การปรับให้เหมาะสมกับสิ่งที่ต้องการฟังก์ชั่นครั้งเดียวเท่านั้น เมื่อเป็นเพียงนักพัฒนารอคอมไพเลอร์ คุณสามารถที่จะใช้เวลานานขึ้นและนำการเพิ่มประสิทธิภาพเดียวกันนั้นไปใช้กับชิ้นส่วนที่ใหญ่กว่าของโปรแกรม ในทำนองเดียวกันโค้ดสำหรับการปรับให้เหมาะสมบางอย่างจะมีขนสวย (และอาจใหญ่มาก) อีกครั้งเนื่องจากผู้ใช้กำลังรอในขณะที่โหลดรหัส (และเวลาเริ่มต้น JVM มักจะเป็นปัจจัยสำคัญในเวลาโดยรวม) การใช้งานจะต้องสมดุลเวลาที่บันทึกไว้ในที่เดียวกับที่หายไปในอีก - และให้รหัสน้อย ได้รับประโยชน์จากการปรับให้เหมาะสมแบบไร้ขนการทำให้ JVM มีขนาดเล็กมักเป็นประโยชน์มากกว่า
ปัญหาที่สองคือเมื่อใช้ Java คุณจะได้รับ "หนึ่งขนาดที่เหมาะกับการแก้ปัญหาทั้งหมด" บ่อยครั้ง ยกตัวอย่างเช่นสำหรับนักพัฒนา Java จำนวนมาก Swing เป็นห้องสมุดหน้าต่างเพียงอย่างเดียวที่มีอยู่ ในบางสิ่งบางอย่างเช่น C ++ นั้นมีไลบรารี windowing หลายสิบเฟรมเวิร์กแอพพลิเคชั่นและอื่น ๆ แต่ละชุดมีการประนีประนอมระหว่างความง่ายในการใช้งานกับการดำเนินการอย่างรวดเร็วรูปลักษณ์และความรู้สึกที่สอดคล้อง จุดยึดที่แท้จริงเพียงอย่างเดียวคือบางอย่าง (เช่น Qt) อาจมีราคาแพง (อย่างน้อยก็เพื่อการใช้งานเชิงพาณิชย์)
รหัสที่สามจำนวนมากที่เขียนใน C ++ (และ C มากยิ่งขึ้น) นั้นเก่าและเป็นผู้ใหญ่มากกว่า ส่วนมากมันมีแกนหลักของงานประจำที่เขียนเมื่อหลายสิบปีก่อนเมื่อใช้เวลาเพิ่มประสิทธิภาพในการปรับรหัสให้เป็นปกติ ซึ่งมักจะมีประโยชน์อย่างแท้จริงในโค้ดที่เล็กกว่าและเร็วกว่า C ++ (หรือ C) ได้รับเครดิตสำหรับรหัสที่มีขนาดเล็กและรวดเร็ว แต่เป็นผลิตภัณฑ์ของนักพัฒนาและข้อ จำกัด ของเวลาที่เขียนโค้ด ในระดับหนึ่งสิ่งนี้นำไปสู่คำทำนายการตอบสนองด้วยตนเอง - เมื่อผู้คนสนใจความเร็วพวกเขามักเลือก C ++ เพราะมีชื่อเสียง พวกเขาเพิ่มเวลาและความพยายามในการเพิ่มประสิทธิภาพและเขียนโค้ด C ++ ที่รวดเร็วรุ่นใหม่
เพื่อสรุปการใช้งานปกติของ Java ทำให้ปัญหาการเพิ่มประสิทธิภาพสูงสุดที่ดีที่สุด ที่เลวร้ายยิ่งกว่าที่มองเห็น Java สิ่งต่าง ๆ เช่นชุดเครื่องมือหน้าต่างและเวลาเริ่มต้นของ JVM มักจะมีบทบาทที่ใหญ่กว่าความเร็วในการเรียกใช้ของภาษาเอง ในหลายกรณี C และ C ++ ยังได้รับเครดิตสำหรับสิ่งที่ผลิตภัณฑ์ของการเพิ่มประสิทธิภาพทำงานหนักขึ้นจริงๆ
สำหรับคำถามที่สองฉันคิดว่าส่วนใหญ่เป็นเรื่องของธรรมชาติของมนุษย์ในที่ทำงาน ความคลั่งไคล้บางอย่างทำให้การอ้างสิทธิ์ที่สูงเกินจริงเกี่ยวกับ Java นั้นรวดเร็วอย่างเหลือเชื่อ บางคนลองใช้งานและพบว่าแม้แต่โปรแกรมเรื่องไร้สาระก็ใช้เวลาสองสามวินาทีในการเริ่มต้นและรู้สึกช้าและเงอะงะเมื่อมันทำงาน มีไม่กี่คนที่ต้องวิเคราะห์สิ่งต่าง ๆ เพื่อตระหนักว่านี่เป็นเวลาเริ่มต้นของ JVM และความจริงที่ว่าเมื่อพวกเขาลองสิ่งต่างๆครั้งแรกก็ยังไม่มีการรวบรวมรหัส - บางส่วนของรหัสถูกตีความ และบางคนก็รวบรวมในขณะที่พวกเขารอ ที่เลวร้ายยิ่งแม้ว่ามันจะทำงานเร็วพอ แต่รูปลักษณ์และความรู้สึกนั้นมักจะดูแปลกตาสำหรับผู้ใช้ส่วนใหญ่ดังนั้นแม้ว่าการวัดตามวัตถุประสงค์จะแสดงเวลาตอบสนองที่รวดเร็ว
การรวมเข้าด้วยกันนำไปสู่ปฏิกิริยาที่ค่อนข้างเรียบง่ายและเป็นธรรมชาติ: Java นั้นช้าน่าเกลียดและเงอะงะ เนื่องจากการพูดเกินจริงที่ว่ามันเร็วมากมีแนวโน้มที่จะตอบสนองเกินจริงและสรุปว่ามันช้าอย่างน่ากลัวแทนที่จะเป็น (แม่นยำกว่า) "ช้าลงเล็กน้อยและส่วนใหญ่ภายใต้สถานการณ์เฉพาะ" นี่เป็นเรื่องที่แย่ที่สุดสำหรับนักพัฒนาที่เขียนโปรแกรมสองสามภาษาเป็นครั้งแรก การดำเนินการของโปรแกรม "สวัสดีโลก" ในภาษาส่วนใหญ่จะปรากฏขึ้นทันที แต่ใน Java มีการหยุดชั่วคราวที่สังเกตได้ง่ายเมื่อ JVM เริ่มต้นขึ้น แม้แต่ล่ามบริสุทธิ์ที่ทำงานช้าลงอย่างมากในลูปที่แคบและมักจะปรากฏขึ้นเร็วขึ้นสำหรับรหัสเช่นนี้เพียงเพราะมันสามารถโหลดและเริ่มดำเนินการได้เร็วขึ้นเล็กน้อย