อ่าน 15 นาที
ประสิทธิภาพของ Java
ใน การพัฒนาซอฟต์แวร์ ภาษาโปรแกรม Java ถือว่าช้ากว่า ภาษา ประเภทเจเนอเร ชั่นที่สามที่ เร็วที่สุด เช่น C และ C++ [ 1 ] ในทางตรงกันข้ามกับภาษาเหล่านั้น Java จะคอมไพล์เป็น Java...
ประสิทธิภาพของ Java
ในการพัฒนาซอฟต์แวร์ภาษาโปรแกรมJavaถือว่าช้ากว่า ภาษา ประเภทเจเนอเรชั่นที่สามที่ เร็วที่สุด เช่นCและC++ [ 1 ]ในทางตรงกันข้ามกับภาษาเหล่านั้น Java จะคอมไพล์เป็นJava Virtual Machine (JVM) โดยค่าเริ่มต้นด้วยการทำงานที่แตกต่างจากการ ทำงานของฮาร์ดแวร์คอมพิวเตอร์จริง การใช้งาน JVM ในยุคแรกๆ เป็นตัวแปลภาษาโดยจะจำลองการทำงานเสมือนทีละรายการแทนที่จะแปลเป็นรหัสเครื่องสำหรับการประมวลผลฮาร์ดแวร์โดยตรง
ตั้งแต่ช่วงปลายทศวรรษ 1990 ความเร็วในการประมวลผลโปรแกรม Java ดีขึ้นอย่างมากจากการนำการคอมไพล์แบบทันเวลา (JIT) มาใช้ (ในปี 1997 สำหรับJava 1.1 ) [ 2 ] [ 3 ] [ 4 ]การเพิ่มคุณสมบัติของภาษาที่สนับสนุนการวิเคราะห์โค้ดที่ดีขึ้น และการเพิ่มประสิทธิภาพใน JVM (เช่นHotSpotกลายเป็นค่าเริ่มต้นสำหรับJVM ของSun ในปี 2000) กลยุทธ์ การเก็บขยะ ที่ซับซ้อน ก็เป็นอีกด้านหนึ่งของการปรับปรุง การประมวลผลไบต์โค้ด Java ด้วยฮาร์ดแวร์ เช่นที่นำเสนอโดยJazelle ของ ARM ได้รับการสำรวจแต่ไม่ได้นำไปใช้งาน
ประสิทธิภาพของ โปรแกรม Java ที่คอมไพล์ด้วย ไบต์โค้ด Java นั้นขึ้นอยู่กับว่า เครื่องเสมือน Java ( JVM) จัดการงานต่างๆ ได้อย่างเหมาะสมเพียงใดและ JVM ใช้ประโยชน์จากคุณสมบัติของฮาร์ดแวร์และระบบปฏิบัติการ (OS) ของคอมพิวเตอร์ได้ดีเพียงใด ดังนั้นการทดสอบหรือเปรียบเทียบประสิทธิภาพ ของ Java ใดๆ ก็ตามจะต้องรายงานเวอร์ชัน ผู้ผลิต ระบบปฏิบัติการ และสถาปัตยกรรมฮาร์ดแวร์ของ JVM ที่ใช้ด้วย ในทำนองเดียวกัน ประสิทธิภาพของโปรแกรมที่คอมไพล์แบบเนทีฟจะขึ้นอยู่กับคุณภาพของโค้ดเครื่องที่สร้างขึ้น ดังนั้น การทดสอบหรือการเปรียบเทียบจึงต้องรายงานชื่อ เวอร์ชัน และผู้ผลิตของคอมไพเลอร์ที่ใช้ และคำสั่ง เพิ่มประสิทธิภาพของคอมไพเลอร์ ที่เปิดใช้งานด้วย
วิธีการเพิ่มประสิทธิภาพเครื่องเสมือน
การปรับปรุงประสิทธิภาพหลายอย่างได้ช่วยเพิ่มประสิทธิภาพของ JVM ตลอดเวลาที่ผ่านมา อย่างไรก็ตาม แม้ว่า Java มักจะเป็นเครื่องเสมือน แรก ที่นำการปรับปรุงเหล่านั้นมาใช้ได้สำเร็จ แต่การปรับปรุงเหล่านั้นก็มักถูกนำไปใช้ในแพลตฟอร์มอื่นๆ ที่คล้ายคลึงกันด้วยเช่นกัน
การคอมไพล์แบบทันเวลาพอดี
JVM รุ่นแรกๆ มักจะตีความไบต์โค้ดของ Java เสมอ ซึ่งส่งผลเสียต่อประสิทธิภาพอย่างมาก โดยมีประสิทธิภาพลดลงระหว่าง 10 ถึง 20 เท่าเมื่อเทียบกับ C ในแอปพลิเคชันทั่วไป[ 5 ]เพื่อแก้ไขปัญหานี้ จึงมีการนำคอมไพเลอร์แบบ Just-in-Time (JIT) มาใช้ใน Java 1.1 เนื่องจากต้นทุนการคอมไพล์ที่สูง จึงมีการเพิ่มระบบที่เรียกว่าHotSpotใน Java 1.2 และกลายเป็นค่าเริ่มต้นใน Java 1.3 โดยใช้เฟรมเวิร์กนี้เครื่องเสมือน Javaจะวิเคราะห์ประสิทธิภาพของโปรแกรมอย่างต่อเนื่องเพื่อหาจุดที่ทำงานหนักหรือทำงานซ้ำๆ จากนั้นจึงกำหนดเป้าหมายเพื่อเพิ่มประสิทธิภาพทำให้ได้การทำงานที่มีประสิทธิภาพสูงโดยมีค่าใช้จ่าย น้อยที่สุด สำหรับโค้ดที่ไม่สำคัญต่อประสิทธิภาพมากนัก[ 6 ] [ 7 ] การทดสอบประสิทธิภาพบางอย่างแสดงให้เห็นถึงความเร็วที่เพิ่มขึ้นถึง 10 เท่าด้วยวิธีนี้[ 8 ]อย่างไรก็ตาม เนื่องจากข้อจำกัดด้านเวลา คอมไพเลอร์จึงไม่สามารถเพิ่มประสิทธิภาพโปรแกรมได้อย่างเต็มที่ ดังนั้นโปรแกรมที่ได้จึงช้ากว่าโค้ดเนทีฟ[ 9 ] [ 10 ]
การเพิ่มประสิทธิภาพแบบปรับตัวได้
การเพิ่มประสิทธิภาพแบบปรับตัวได้ (Adaptive optimizing) เป็นวิธีการในวิทยาการคอมพิวเตอร์ที่ทำการคอมไพล์ส่วนต่างๆ ของโปรแกรมใหม่แบบไดนามิกโดยอิงจากโปรไฟล์การทำงานปัจจุบัน ในการใช้งานแบบง่ายๆ ตัวเพิ่มประสิทธิภาพแบบปรับตัวได้อาจทำการแลกเปลี่ยนระหว่างการคอมไพล์แบบทันเวลา (just-in-time compiling) และการตีความคำสั่ง ในอีกระดับหนึ่ง การเพิ่มประสิทธิภาพแบบปรับตัวได้อาจใช้ประโยชน์จากเงื่อนไขข้อมูลเฉพาะที่เพื่อเพิ่มประสิทธิภาพโดยการกำจัดเงื่อนไขการแยกสาขาและใช้การขยายแบบอินไลน์ (inline expansion)
เครื่องเสมือน Javaเช่นHotSpotยังสามารถดีออพติคิวเลตโค้ดที่เคย JIT ไว้ก่อนหน้านี้ได้ ซึ่งช่วยให้สามารถทำการเพิ่มประสิทธิภาพที่รุนแรง (และอาจไม่ปลอดภัย) ได้ ในขณะที่ยังสามารถดีออพติคิวเลตโค้ดในภายหลังและกลับไปสู่เส้นทางที่ปลอดภัยได้[ 11 ] [ 12 ]
การเก็บขยะ
เครื่องเสมือน Java (JVM) เวอร์ชัน 1.0 และ 1.1 ใช้ตัวเก็บขยะแบบ mark-sweepซึ่งอาจทำให้ฮีป แตกกระจาย หลังจากการเก็บขยะ ตั้งแต่ Java 1.2 เป็นต้นไป JVM ได้เปลี่ยนไปใช้ตัวเก็บขยะแบบ generationalซึ่งมีพฤติกรรมการลดการแตกกระจายที่ดีกว่ามาก[ 13 ] JVM รุ่นใหม่ใช้หลากหลายวิธีที่ช่วยปรับปรุงประสิทธิภาพการเก็บขยะ ให้ดียิ่งขึ้นไปอีก [ 14 ]
วิธีการเพิ่มประสิทธิภาพอื่นๆ
อุ๊ปส์ที่ถูกบีบอัด
Compressed Oops ช่วยให้ Java 5.0 ขึ้นไปสามารถเข้าถึงหน่วยความจำฮีปได้สูงสุดถึง 32 GB ด้วยการอ้างอิงแบบ 32 บิต Java ไม่รองรับการเข้าถึงไบต์แต่ละตัว แต่รองรับเฉพาะอ็อบเจ็กต์ซึ่งจัดเรียงแบบ 8 ไบต์ตามค่าเริ่มต้น ด้วยเหตุนี้ 3 บิตล่างสุดของการอ้างอิงฮีปจึงเป็น 0 เสมอ การลดความละเอียดของการอ้างอิง 32 บิตลงเหลือบล็อก 8 ไบต์ ทำให้พื้นที่ที่สามารถเข้าถึงได้เพิ่มขึ้นเป็น 32 GB ซึ่งช่วยลดการใช้หน่วยความจำลงอย่างมากเมื่อเทียบกับการใช้การอ้างอิง 64 บิต เนื่องจาก Java ใช้การอ้างอิงมากกว่าภาษาอื่นๆ เช่น C++ Java 8 รองรับการจัดเรียงที่ใหญ่กว่า เช่น การจัดเรียง 16 ไบต์ เพื่อรองรับหน่วยความจำได้สูงสุดถึง 64 GB ด้วยการอ้างอิง 32 บิต
การตรวจสอบไบต์โค้ดแบบแยกส่วน
ก่อนที่จะเรียกใช้คลาสใดๆ JVM ของ Sun จะตรวจสอบไบต์โค้ดของ Java (ดูตัวตรวจสอบไบต์โค้ด ) การตรวจสอบนี้จะดำเนินการแบบไม่ทันที: ไบต์โค้ดของคลาสจะถูกโหลดและตรวจสอบก็ต่อเมื่อคลาสเฉพาะนั้นถูกโหลดและเตรียมพร้อมสำหรับการใช้งานเท่านั้น ไม่ใช่ในตอนเริ่มต้นของโปรแกรม อย่างไรก็ตาม เนื่องจากไลบรารีคลาส ของ Java ก็เป็นคลาส Java ทั่วไปเช่นกัน จึงต้องถูกโหลดเมื่อมีการใช้งาน ซึ่งหมายความว่าเวลาเริ่มต้นของโปรแกรม Java มักจะนานกว่า โปรแกรม C++เป็นต้น
วิธีการที่เรียกว่าการตรวจสอบแบบแบ่งเวลาซึ่งเปิดตัวครั้งแรกในJava Platform, Micro Edition (J2ME) ถูกนำมาใช้ใน JVM ตั้งแต่Java เวอร์ชัน 6โดยจะแบ่งการตรวจสอบไบต์โค้ดของ Javaออกเป็นสองขั้นตอน: [ 15 ]
- ขั้นตอนการออกแบบ – เมื่อทำการคอมไพล์คลาสจากซอร์สโค้ดไปเป็นไบต์โค้ด
- รันไทม์ – เมื่อโหลดคลาส
ในทางปฏิบัติ วิธีนี้ทำงานโดยการเก็บรวบรวมความรู้ที่คอมไพเลอร์ Java มีเกี่ยวกับลำดับการทำงานของคลาส และใส่คำอธิบายประกอบลงในไบต์โค้ดของเมธอดที่คอมไพล์แล้วด้วยบทสรุปของข้อมูลลำดับการทำงานของคลาส วิธีนี้ไม่ได้ทำให้การตรวจสอบในขณะรันไทม์ซับซ้อนน้อยลงอย่างเห็นได้ชัด แต่ช่วยให้มีทางลัดบางอย่าง
การวิเคราะห์การหลบหนีและการทำให้ล็อกหยาบขึ้น
ภาษา Java สามารถจัดการมัลติเธรดดิ้ง ได้ ในระดับภาษา มัลติเธรดดิ้งช่วยให้โปรแกรมสามารถประมวลผลหลายกระบวนการพร้อมกันได้ ซึ่งจะช่วยปรับปรุงประสิทธิภาพของโปรแกรมที่ทำงานบนระบบคอมพิวเตอร์ที่มีโปรเซสเซอร์หรือคอร์หลายตัว นอกจากนี้ แอปพลิเคชันแบบมัลติเธรดดิ้งยังคงตอบสนองต่ออินพุตได้แม้ในขณะที่กำลังทำงานที่ใช้เวลานาน
อย่างไรก็ตาม โปรแกรมที่ใช้มัลติเธรดดิ้งจำเป็นต้องดูแลวัตถุที่ใช้ร่วมกันระหว่างเธรดเป็นพิเศษ โดยต้องล็อกการเข้าถึงเมธอดหรือบล็อกที่ ใช้ร่วมกัน เมื่อมีการใช้งานโดยเธรดใดเธรดหนึ่ง การล็อกบล็อกหรือวัตถุเป็นกระบวนการที่ใช้เวลานานเนื่องจากลักษณะของ กระบวนการระดับ ระบบปฏิบัติการที่เกี่ยวข้อง (ดูการควบคุมการทำงานพร้อมกันและความละเอียดของการล็อก )
เนื่องจากไลบรารี Java ไม่ทราบว่าเมธอดใดจะถูกใช้งานโดยเธรดมากกว่าหนึ่งเธรด ไลบรารีมาตรฐานจึงล็อกบล็อกเมื่อจำเป็นในสภาพแวดล้อมแบบมัลติเธรด เสมอ
ก่อน Java 6 เครื่องเสมือนจะล็อกอ็อบเจ็กต์และบล็อกเสมอเมื่อโปรแกรมร้องขอ แม้ว่าจะไม่มีความเสี่ยงที่อ็อบเจ็กต์จะถูกแก้ไขโดยเธรดสองเธรดพร้อมกันก็ตาม ตัวอย่างเช่น ในกรณีนี้ ตัวแปรโลคอล จะถูกล็อกก่อนการดำเนินการ บวก แต่ละครั้ง เพื่อให้แน่ใจว่าจะไม่ถูกแก้ไขโดยเธรดอื่น ( มีการซิงโครไนซ์) แต่เนื่องจากเป็นตัวแปรโลคอลเฉพาะเมธอดเท่านั้น จึงไม่จำเป็นต้อง Vectorล็อกอีกต่อไปVector
public String getNames () { final Vector <String> v = new Vector <> ( ); v.add ( "Me" ) ; v.add ( " You " ) ; v.add ( " Her " ) ; return v.toString ( ) ; }ตั้งแต่ Java 6 เป็นต้นไป บล็อกโค้ดและวัตถุจะถูกล็อกเฉพาะเมื่อจำเป็นเท่านั้น[ 16 ]ดังนั้นในกรณีข้างต้น เครื่องเสมือนจะไม่ล็อกวัตถุ Vector เลย
ตั้งแต่เวอร์ชัน 6u23 Java ได้รวมการสนับสนุนสำหรับการวิเคราะห์การหลีกเลี่ยงไว้ด้วย[ 17 ]
การปรับปรุงการจัดสรรทะเบียน
ก่อนJava 6การจัดสรรรีจิสเตอร์ ในเครื่องเสมือนฝั่ง ไคลเอ็นต์นั้นค่อนข้างพื้นฐาน(รีจิสเตอร์ไม่ได้กระจายอยู่ทั่วบล็อก ) ซึ่งเป็นปัญหาในการออกแบบซีพียูที่มีรีจิสเตอร์ น้อยกว่า เช่นในสถาปัตยกรรมx86หากไม่มีรีจิสเตอร์เหลือสำหรับการดำเนินการ คอมไพเลอร์จะต้องคัดลอกข้อมูลจากรีจิสเตอร์ไปยังหน่วยความจำ (หรือจากหน่วยความจำไปยังรีจิสเตอร์) ซึ่งใช้เวลานาน (การเข้าถึงรีจิสเตอร์เร็วกว่ามาก) อย่างไรก็ตาม เครื่องเสมือนฝั่ง เซิร์ฟเวอร์ใช้ ตัวจัดสรร แบบกราฟสีและไม่มีปัญหาดังกล่าว
มีการนำการเพิ่มประสิทธิภาพการจัดสรรรีจิสเตอร์มาใช้ใน JDK 6 ของ Sun [ 18 ]ทำให้สามารถใช้รีจิสเตอร์เดียวกันข้ามบล็อกได้ (เมื่อเหมาะสม) ซึ่งช่วยลดการเข้าถึงหน่วยความจำ ส่งผลให้ประสิทธิภาพเพิ่มขึ้นประมาณ 60% ในการทดสอบประสิทธิภาพบางรายการ[ 19 ]
การแบ่งปันข้อมูลชั้นเรียน
การแชร์ข้อมูลคลาส (เรียกว่า CDS โดย Sun) เป็นกลไกที่ช่วยลดเวลาเริ่มต้นสำหรับแอปพลิเคชัน Java และยังช่วยลดการใช้หน่วยความจำ อีกด้วย เมื่อ ติดตั้ง JREตัวติดตั้งจะโหลดชุดคลาสจาก ไฟล์ JAR ของระบบ (ไฟล์ JAR ที่เก็บไลบรารีคลาส Java ทั้งหมด เรียกว่า rt.jar) ลงในตัวแทนภายในส่วนตัว และดัมพ์ตัวแทนนั้นลงในไฟล์ที่เรียกว่า "ไฟล์เก็บถาวรที่ใช้ร่วมกัน" ในระหว่างการเรียกใช้ JVM ครั้งต่อๆ ไป ไฟล์เก็บถาวรที่ใช้ร่วมกันนี้จะถูกแมปหน่วยความจำ เข้ามา ช่วยประหยัดค่าใช้จ่ายในการโหลดคลาสเหล่านั้น และอนุญาตให้ เมตาเดต้าของ JVM สำหรับคลาสเหล่านี้ส่วนใหญ่สามารถใช้ร่วมกันได้ระหว่างกระบวนการ JVM หลายกระบวนการ[ 20 ]
การปรับปรุงที่สอดคล้องกันในเวลาเริ่มต้นนั้นเห็นได้ชัดเจนยิ่งขึ้นสำหรับโปรแกรมขนาดเล็ก[ 21 ]
ประวัติการปรับปรุงประสิทธิภาพ
นอกเหนือจากการปรับปรุงที่ระบุไว้ในที่นี้แล้ว Java แต่ละเวอร์ชันยังได้นำเสนอการปรับปรุงประสิทธิภาพมากมายใน JVM และอินเทอร์เฟซการเขียนโปรแกรมแอปพลิเคชัน ของ Java (API) อีกด้วย
JDK 1.1.6: การคอมไพล์แบบ just-in-time ครั้งแรก ( คอมไพเลอร์ JIT ของSymantec ) [ 2 ] [ 22 ]
J2SE 1.2: การใช้ตัว เก็บ รวบรวม ข้อมูลแบบแบ่งรุ่น
J2SE 1.3: การ คอม ไพล์แบบ Just-in-timeโดยHotSpot
J2SE 1.4: ดูที่นี่สำหรับภาพรวมของ Sun เกี่ยวกับการปรับปรุงประสิทธิภาพระหว่างเวอร์ชัน 1.3 และ 1.4
Java SE 5.0: การแบ่งปันข้อมูลคลาส[ 23 ]
Java SE 6:
การปรับปรุงอื่นๆ:
- Java OpenGL Java 2D pipeline speed improvements [ 24 ]
- ประสิทธิภาพ Java 2D ยังได้รับการปรับปรุงอย่างมีนัยสำคัญใน Java 6 [ 25 ]
ดูเพิ่มเติมที่ 'ภาพรวมของ Sun เกี่ยวกับการปรับปรุงประสิทธิภาพระหว่าง Java 5 และ Java 6' [ 26 ]
Java SE 6 อัปเดต 10
- Java Quick Starter ช่วยลดเวลาในการเริ่มต้นแอปพลิเคชันโดยการโหลดข้อมูล JRE บางส่วนล่วงหน้าในแคชดิสก์เมื่อ เริ่มต้นระบบปฏิบัติการ [ 27 ]
- ส่วนต่าง ๆ ของแพลตฟอร์มที่จำเป็นในการเรียกใช้แอปพลิเคชันที่เข้าถึงจากเว็บเมื่อไม่ได้ติดตั้ง JRE จะถูกดาวน์โหลดก่อน JRE เวอร์ชันเต็มมีขนาด 12 MB แอปพลิเคชัน Swing ทั่วไปต้องการดาวน์โหลดเพียง 4 MB เพื่อเริ่มต้น ส่วนที่เหลือจะถูกดาวน์โหลดในพื้นหลัง[ 28 ]
- ประสิทธิภาพกราฟิกบนWindowsดีขึ้นจากการใช้Direct3D อย่างกว้างขวาง โดยค่าเริ่มต้น[ 29 ]และใช้shadersบนหน่วยประมวลผลกราฟิก (GPU) เพื่อเร่งการทำงานของ Java 2D ที่ซับซ้อน [ 30 ]
จาวา 7
มีการปรับปรุงประสิทธิภาพหลายอย่างสำหรับ Java 7: มีการวางแผนการปรับปรุงประสิทธิภาพในอนาคตสำหรับการอัปเดต Java 6 หรือ Java 7: [ 31 ]
- จัดเตรียมการสนับสนุน JVM สำหรับภาษาการเขียนโปรแกรมแบบไดนามิกโดยปฏิบัติตามงานต้นแบบที่ดำเนินการในปัจจุบันบนเครื่อง Da Vinci (เครื่องเสมือนหลายภาษา) [ 32 ]
- ปรับปรุงไลบรารีการทำงานพร้อมกันที่มีอยู่โดยการจัดการการประมวลผลแบบขนานบนโปรเซสเซอร์มัลติคอ ร์ [ 33 ] [ 34 ]
- อนุญาตให้ JVM ใช้ทั้งคอมไพเลอร์ JIT ของไคลเอ็นต์และเซิร์ฟเวอร์ ในเซสชันเดียวกันด้วยวิธีการที่เรียกว่าการคอมไพล์แบบแบ่งระดับ: [ 35 ]
- ควรใช้ ไคลเอ็นต์นี้ในช่วงเริ่มต้น (เนื่องจากมีประสิทธิภาพดีในช่วงเริ่มต้นและสำหรับแอปพลิเคชันขนาดเล็ก)
- เซิร์ฟเวอร์จะถูกใช้สำหรับการเรียกใช้งานแอปพลิเคชันในระยะยาว (เนื่องจากมีประสิทธิภาพเหนือกว่าคอมไพเลอร์ฝั่งไคลเอนต์ สำหรับการ ใช้ งาน นี้)
- แทนที่ตัวเก็บขยะแบบขนานที่มีการหยุดชั่วคราวต่ำที่มีอยู่ (เรียกอีกอย่างว่าตัวเก็บขยะแบบขนานที่มีการทำเครื่องหมายและกวาด (CMS)) ด้วยตัวเก็บขยะใหม่ที่เรียกว่า Garbage First (G1) เพื่อให้แน่ใจว่ามีการหยุดชั่วคราวที่สม่ำเสมอเมื่อเวลาผ่านไป[ 36 ] [ 37 ]
การเปรียบเทียบกับภาษาอื่นๆ
การเปรียบเทียบประสิทธิภาพของโปรแกรม Java กับโปรแกรมที่เทียบเท่ากันซึ่งเขียนด้วยภาษาอื่น เช่นC++อย่างเป็นกลางนั้น จำเป็นต้องมีเกณฑ์มาตรฐานที่สร้างขึ้นอย่างรอบคอบและพิถีพิถัน ซึ่งเปรียบเทียบโปรแกรมที่ทำงานเหมือนกันทุกประการแพลตฟอร์ม เป้าหมาย ของ คอมไพเลอ ร์ไบต์โค้ด ของ Java คือแพลตฟอร์ม Javaและไบต์โค้ดจะถูกตีความหรือคอมไพล์เป็นรหัสเครื่องโดย JVM คอมไพเลอร์อื่นๆ เกือบทั้งหมดกำหนดเป้าหมายไปที่แพลตฟอร์มฮาร์ดแวร์และซอฟต์แวร์ที่เฉพาะเจาะจง โดยสร้างรหัสเครื่องที่จะแทบไม่เปลี่ยนแปลงระหว่างการทำงาน สถานการณ์ที่แตกต่างกันมากและยากต่อการเปรียบเทียบเกิดขึ้นจากสองแนวทางที่แตกต่างกันนี้ เช่นการคอมไพล์และ การคอมไพล์ซ้ำแบบคงที่และ แบบไดนามิก ความพร้อมใช้งานของข้อมูลที่แม่นยำเกี่ยวกับสภาพแวดล้อมการทำงาน และอื่นๆ
Java มักจะคอมไพล์แบบ just-in-timeในขณะรันไทม์โดย Java virtual machineแต่ก็อาจจะคอมไพล์แบบ ahead-of-time ได้เช่นกัน เช่นเดียวกับ C++ เมื่อคอมไพล์แบบ just-in-time ไมโครเบนช์มาร์คของThe Computer Language Benchmarks Gameระบุถึงประสิทธิภาพดังต่อไปนี้: [ 38 ]
- ช้ากว่าภาษา คอมไพล์ เช่นCหรือC++ [ 39 ]
- คล้ายกับภาษาคอมไพล์ แบบ just-in-time อื่นๆ เช่นC# [ 40 ]
- เร็วกว่าภาษาที่ไม่มีคอมไพเลอร์เนทีฟโค้ดที่มีประสิทธิภาพ ( JITหรือ AOT )เช่นPerl , Ruby , PHPและPython มาก [ 41 ]
ความเร็วของโปรแกรม
เกณฑ์มาตรฐานมักวัดประสิทธิภาพสำหรับโปรแกรมขนาดเล็กที่มีการคำนวณเชิงตัวเลขจำนวนมาก ในโปรแกรมจริงบางโปรแกรม Java มีประสิทธิภาพเหนือกว่า C ตัวอย่างหนึ่งคือเกณฑ์มาตรฐานของJake2 (โคลนของQuake IIที่เขียนด้วย Java โดยการแปล โค้ด C GPL ดั้งเดิม ) เวอร์ชัน Java 5.0 มีประสิทธิภาพดีกว่าเวอร์ชัน C ในบางการกำหนดค่าฮาร์ดแวร์[ 42 ]แม้ว่าจะไม่ได้ระบุวิธีการวัดข้อมูล (ตัวอย่างเช่น หากใช้ไฟล์ปฏิบัติการ Quake II ดั้งเดิมที่คอมไพล์ในปี 1997 ซึ่งอาจถือว่าไม่ดี เนื่องจากคอมไพเลอร์ C ในปัจจุบันอาจเพิ่มประสิทธิภาพสำหรับ Quake ได้ดีกว่า) แต่ก็สังเกตว่าซอร์สโค้ด Java เดียวกันสามารถเพิ่มความเร็วได้อย่างมากเพียงแค่การอัปเดต VM ซึ่งเป็นสิ่งที่ทำไม่ได้ด้วยวิธีการคงที่ 100%
สำหรับโปรแกรมอื่นๆ เวอร์ชัน C++ สามารถทำงานได้เร็วกว่าเวอร์ชัน Java อย่างเห็นได้ชัด และโดยปกติแล้ว การทดสอบประสิทธิภาพที่ดำเนินการโดย Google ในปี 2011 แสดงให้เห็นถึงความแตกต่างถึง 10 เท่าระหว่าง C++ และ Java [ 43 ]ในทางตรงกันข้าม การทดสอบประสิทธิภาพทางวิชาการที่ดำเนินการในปี 2012 ด้วยอัลกอริทึมการสร้างแบบจำลอง 3 มิติ แสดงให้เห็นว่าJava 6 JVM ช้ากว่า C++ บน Windows ถึง 1.09 ถึง 1.91 เท่า[ 44 ]
การเพิ่มประสิทธิภาพบางอย่างที่เป็นไปได้ใน Java และภาษาที่คล้ายกันอาจไม่สามารถทำได้ในบางสถานการณ์ใน C++: [ 45 ]
- การใช้ พอยเตอร์แบบ C อาจขัดขวางการปรับแต่งประสิทธิภาพในภาษาโปรแกรมที่รองรับพอยเตอร์
- การใช้ วิธี การวิเคราะห์การหลบหนีมีข้อจำกัดในC++ตัวอย่างเช่น เนื่องจากคอมไพเลอร์ C++ ไม่ทราบเสมอไปว่าวัตถุจะถูกแก้ไขในบล็อกโค้ดที่กำหนดเนื่องจากตัวชี้ [ หมายเหตุ1 ]
- Java สามารถเข้าถึงเมธอดอินสแตนซ์ที่สืบทอดมาได้เร็วกว่าที่ C++ สามารถเข้าถึงเมธอดเสมือนที่สืบทอดมาได้ เนื่องจาก C++ มีการค้นหาในตารางเสมือนเพิ่มเติม อย่างไรก็ตาม เมธอดที่ไม่ใช่เสมือนใน C++ ไม่ประสบปัญหาคอขวดด้านประสิทธิภาพของตารางเสมือน ดังนั้นจึงมีประสิทธิภาพใกล้เคียงกับ Java
JVM ยังสามารถดำเนินการเพิ่มประสิทธิภาพเฉพาะโปรเซสเซอร์หรือการขยายแบบอินไลน์ได้และความสามารถในการลดประสิทธิภาพของโค้ดที่คอมไพล์หรืออินไลน์แล้วบางครั้งทำให้สามารถดำเนินการเพิ่มประสิทธิภาพที่รุนแรงกว่าภาษาที่มีประเภทคงที่เมื่อมีฟังก์ชันไลบรารีภายนอกเข้ามาเกี่ยวข้อง[ 46 ] [ 47 ]
ผลลัพธ์ของการทดสอบประสิทธิภาพระดับไมโครระหว่าง Java และ C++ ขึ้นอยู่กับว่านำการดำเนินการใดมาเปรียบเทียบ ตัวอย่างเช่น เมื่อเปรียบเทียบกับ Java 5.0:
- การดำเนินการทางคณิตศาสตร์ 32 บิตและ 64 บิต[ 48 ] [ 49 ]การรับ/ส่งข้อมูลไฟล์[ 50 ]และการจัดการข้อยกเว้น[ 51 ]มีประสิทธิภาพใกล้เคียงกับโปรแกรม C++ ที่เทียบเคียงได้
- การดำเนินการกับอาร์เรย์[ 52 ]มีประสิทธิภาพที่ดีกว่าใน C
- ประสิทธิภาพของฟังก์ชันตรีโกณมิติดีขึ้นมากในภาษา C [ 53 ]
- หมายเหตุ
- ^ปัญหาความขัดแย้งในลักษณะนี้สามารถบรรเทาได้ในโปรแกรม C++ ที่ระดับซอร์สโค้ดโดยใช้วิธีขั้นสูง เช่นตัวจัดสรรหน่วย ความจำแบบกำหนดเอง ซึ่งใช้ประโยชน์จากความซับซ้อนของการเขียนโค้ดระดับต่ำที่ Java ออกแบบมาเพื่อปกปิดและห่อหุ้ม อย่างไรก็ตาม วิธีการนี้ไม่ค่อยได้ผลหากไม่ได้นำมาใช้ (หรืออย่างน้อยก็คาดการณ์ไว้) ในขณะที่โปรแกรมยังอยู่ในระหว่างการพัฒนาขั้นต้น
ประสิทธิภาพมัลติคอร์
ความสามารถในการปรับขนาดและประสิทธิภาพของแอปพลิเคชัน Java บนระบบมัลติคอร์นั้นถูกจำกัดด้วยอัตราการจัดสรรวัตถุ ผลกระทบนี้บางครั้งเรียกว่า "กำแพงการจัดสรร" [ 54 ]อย่างไรก็ตาม ในทางปฏิบัติ อัลกอริทึมตัวเก็บขยะสมัยใหม่ใช้หลายคอร์ในการดำเนินการเก็บขยะ ซึ่งช่วยบรรเทาปัญหานี้ได้ในระดับหนึ่ง มีรายงานว่าตัวเก็บขยะบางตัวสามารถรองรับอัตราการจัดสรรได้มากกว่าหนึ่งกิกะไบต์ต่อวินาที[ 55 ]และมีระบบที่ใช้ Java ซึ่งไม่มีปัญหาในการปรับขนาดไปยังคอร์ CPU หลายร้อยคอร์และฮีปขนาดหลายร้อยกิกะไบต์[ 56 ]
การจัดการหน่วยความจำอัตโนมัติใน Java ช่วยให้สามารถใช้โครงสร้างข้อมูลแบบไร้การล็อกและเปลี่ยนแปลงไม่ได้อย่างมีประสิทธิภาพ ซึ่งทำได้ยากมากหรือบางครั้งเป็นไปไม่ได้เลยหากไม่มีระบบเก็บขยะ (garbage collection) Java มีโครงสร้างระดับสูงดังกล่าวจำนวนมากในไลบรารีมาตรฐานในแพ็กเกจ java.util.concurrent ในขณะที่ภาษาโปรแกรมหลายภาษาที่เคยใช้สำหรับระบบประสิทธิภาพสูง เช่น C หรือ C++ ยังขาดโครงสร้างเหล่านี้อยู่
เวลาเริ่มต้น
โดยทั่วไปแล้ว เวลาเริ่มต้นทำงานของ Java จะช้ากว่าภาษาโปรแกรมอื่นๆ หลายภาษา เช่นC , C++ , PerlหรือPython มาก เนื่องจากต้องโหลดคลาสจำนวนมาก (โดยเฉพาะคลาสจากไลบรารีคลาสของแพลตฟอร์ม ) ก่อนที่จะนำมาใช้งาน
เมื่อเปรียบเทียบกับรันไทม์ยอดนิยมที่คล้ายกัน สำหรับโปรแกรมขนาดเล็กที่ทำงานบนเครื่อง Windows เวลาเริ่มต้นดูเหมือนจะคล้ายกับของ Mono และช้ากว่าของ . NETเล็กน้อย[ 57 ]
ดูเหมือนว่าเวลาเริ่มต้นส่วนใหญ่เกิดจากการดำเนินการที่ผูกกับการรับส่งข้อมูล (IO) มากกว่าการเริ่มต้น JVM หรือการโหลดคลาส ( ไฟล์ข้อมูลคลาส rt.jarเพียงอย่างเดียวมีขนาด 40 MB และ JVM ต้องค้นหาข้อมูลจำนวนมากในไฟล์ขนาดใหญ่นี้) [ 27 ] การทดสอบบางอย่างแสดงให้เห็นว่าถึงแม้ว่าวิธี การตรวจสอบไบต์โค้ดแบบแยกส่วนใหม่จะช่วยปรับปรุงการโหลดคลาสได้ประมาณ 40% แต่ก็ช่วยปรับปรุงการเริ่มต้นโปรแกรมขนาดใหญ่ได้เพียงประมาณ 5% เท่านั้น[ 58 ]
แม้จะเป็นการปรับปรุงเพียงเล็กน้อย แต่จะเห็นได้ชัดเจนกว่าในโปรแกรมขนาดเล็กที่ดำเนินการง่ายๆ แล้วจึงจบการทำงาน เนื่องจากภาระการโหลดข้อมูลของแพลตฟอร์ม Java อาจมากกว่าภาระการทำงานของโปรแกรมจริงหลายเท่า
ตั้งแต่ Java SE 6 Update 10 เป็นต้นไป Sun JRE มาพร้อมกับ Quick Starter ที่จะโหลดข้อมูลคลาสล่วงหน้าเมื่อระบบปฏิบัติการเริ่มต้นทำงาน เพื่อดึงข้อมูลจากแคชบนดิสก์แทนที่จะดึงจากดิสก์โดยตรง
Excelsior JETแก้ปัญหาจากอีกมุมหนึ่ง โปรแกรม Startup Optimizer ของมันช่วยลดปริมาณข้อมูลที่ต้องอ่านจากดิสก์เมื่อแอปพลิเคชันเริ่มต้นทำงาน และทำให้การอ่านข้อมูลเป็นไปอย่างเป็นลำดับมากขึ้น
ในเดือนพฤศจิกายน พ.ศ. 2547 Nailgunซึ่งเป็น "ไคลเอ็นต์ โปรโตคอล และเซิร์ฟเวอร์สำหรับการรันโปรแกรม Java จากบรรทัดคำสั่งโดยไม่ต้องเสียค่าใช้จ่ายในการเริ่มต้น JVM" ได้ถูกเผยแพร่สู่สาธารณะ[ 59 ] โดยนำเสนอตัวเลือกสำหรับ สคริปต์ในการใช้ JVM เป็นเดมอนเป็นครั้งแรกเพื่อรันแอปพลิเคชัน Java หนึ่งรายการหรือมากกว่าโดยไม่ต้องเสียค่าใช้จ่ายในการเริ่มต้น JVM เดมอน Nailgun ไม่ปลอดภัย: "โปรแกรมทั้งหมดทำงานด้วยสิทธิ์เดียวกันกับเซิร์ฟเวอร์" ในกรณีที่ ต้องการความปลอดภัย แบบหลายผู้ใช้ Nailgun จึงไม่เหมาะสมหากไม่มีข้อควรระวังเป็นพิเศษ สคริปต์ที่การเริ่มต้น JVM ต่อแอปพลิเคชันใช้ทรัพยากรมาก จะเห็นประสิทธิภาพการทำงานที่ดีขึ้น หนึ่งถึงสอง เท่า[ 60 ]
การใช้งานหน่วยความจำ
การใช้หน่วยความจำของ Java สูงกว่าการใช้หน่วยความจำของ C++ มาก เนื่องจาก:
- ใน Java มีค่าใช้จ่ายเพิ่มเติม 8 ไบต์สำหรับแต่ละอ็อบเจ็กต์และ 12 ไบต์สำหรับแต่ละอาร์เรย์[ 61 ]หากขนาดของอ็อบเจ็กต์ไม่ใช่จำนวนเท่าของ 8 ไบต์ ระบบจะปัดขึ้นเป็นจำนวนเท่าของ 8 ถัดไป ซึ่งหมายความว่าอ็อบเจ็กต์ที่เก็บฟิลด์หนึ่งไบต์จะใช้พื้นที่ 16 ไบต์และต้องการการอ้างอิง 4 ไบต์ C++ ยังจัดสรรพอยเตอร์ (โดยปกติ 4 หรือ 8 ไบต์) สำหรับทุกอ็อบเจ็กต์ที่คลาสประกาศฟังก์ชันเสมือน โดยตรงหรือโดยอ้อม [ 62 ]
- การขาดการคำนวณแอดเดรสทำให้การสร้างคอนเทนเนอร์ที่มีประสิทธิภาพด้านหน่วยความจำ เช่น โครงสร้างที่มีระยะห่างแคบและรายการเชื่อมโยงแบบ XORเป็นไปไม่ได้ในปัจจุบัน ( โครงการ OpenJDK Valhallaมีเป้าหมายที่จะบรรเทาปัญหาเหล่านี้ แม้ว่าจะไม่ได้มุ่งเน้นที่จะนำการคำนวณพอยเตอร์มาใช้ เนื่องจากไม่สามารถทำได้ในสภาพแวดล้อมที่มีการเก็บขยะ)
- ตรงกันข้ามกับ malloc และ new ค่าใช้จ่ายด้านประสิทธิภาพโดยเฉลี่ยของการเก็บขยะจะเข้าใกล้ศูนย์อย่างไม่สิ้นสุด (หรือแม่นยำกว่านั้นคือรอบการทำงานของ CPU หนึ่งรอบ) เมื่อขนาดฮีปเพิ่มขึ้น[ 63 ]
- ส่วนต่าง ๆ ของไลบรารีคลาส Javaจะต้องโหลดก่อนการดำเนินการโปรแกรม (อย่างน้อยคลาสที่ใช้ภายในโปรแกรม) [ 64 ]ซึ่งนำไปสู่ภาระหน่วยความจำจำนวนมากสำหรับแอปพลิเคชันขนาดเล็ก
- โดยทั่วไปแล้ว ทั้งไฟล์ไบนารีของ Java และการคอมไพล์แบบเนทีฟจะอยู่ในหน่วยความจำ
- เครื่องเสมือนใช้หน่วยความจำจำนวนมาก
- ในภาษา Java อ็อบเจ็กต์แบบผสม (คลาส A ซึ่งใช้อินสแตนซ์ของ B และ C) ถูกสร้างขึ้นโดยใช้การอ้างอิงไปยังอินสแตนซ์ที่จัดสรรไว้ของ B และ C ในภาษา C++ สามารถหลีกเลี่ยงค่าใช้จ่ายด้านหน่วยความจำและประสิทธิภาพของการอ้างอิงประเภทนี้ได้ เมื่ออินสแตนซ์ของ B และ/หรือ C มีอยู่ภายใน A แล้ว
โดยทั่วไปแล้ว แอปพลิเคชันที่เขียนด้วย C++ จะใช้หน่วยความจำน้อยกว่าแอปพลิเคชันที่เขียนด้วย Java ที่มีฟังก์ชันเทียบเท่ากัน เนื่องจากค่าใช้จ่ายในการทำงานที่สูงของเครื่องเสมือน การโหลดคลาส และการปรับขนาดหน่วยความจำอัตโนมัติของ Java สำหรับโปรแกรมที่หน่วยความจำเป็นปัจจัยสำคัญในการเลือกภาษาและสภาพแวดล้อมการทำงาน จำเป็นต้องมีการวิเคราะห์ต้นทุนและผลประโยชน์
ฟังก์ชันตรีโกณมิติ
ประสิทธิภาพของฟังก์ชันตรีโกณมิติแย่กว่า C เพราะ Java มีข้อกำหนดที่เข้มงวดสำหรับผลลัพธ์ของการดำเนินการทางคณิตศาสตร์ ซึ่งอาจไม่สอดคล้องกับการใช้งานฮาร์ดแวร์พื้นฐาน[ 65 ]บน ชุดย่อยจุดลอยตัว x87 Java ตั้งแต่เวอร์ชัน 1.4 เป็นต้นไปจะลดอาร์กิวเมนต์สำหรับ sin และ cos ในซอฟต์แวร์[ 66 ]ทำให้ประสิทธิภาพลดลงอย่างมากสำหรับค่าที่อยู่นอกช่วง[ 67 ]
อินเทอร์เฟซเนทีฟ Java
Java Native Interfaceเรียกใช้โอเวอร์เฮดสูง ทำให้การข้ามขอบเขตระหว่างโค้ดที่ทำงานบน JVM และโค้ดเนทีฟมีค่าใช้จ่ายสูง[ 68 ] [ 69 ] [ 70 ] Java Native Access (JNA) ช่วยให้ โปรแกรม Javaเข้าถึงไลบรารีที่ใช้ร่วมกัน แบบเนทีฟ ( ไลบรารีลิงก์แบบไดนามิก (DLL) บน Windows) ได้ง่ายผ่านโค้ด Java เท่านั้น โดยไม่ต้องใช้ JNI หรือโค้ดเนทีฟ ฟังก์ชันการทำงานนี้เทียบได้กับ Platform/Invoke ของ Windows และ ctypes ของ Pythonการเข้าถึงเป็นแบบไดนามิกในขณะรันไทม์โดยไม่ต้องสร้างโค้ด แต่มีค่าใช้จ่าย และ JNA มักจะช้ากว่า JNI [ 71 ]
ส่วนติดต่อผู้ใช้
Swingถูกมองว่าช้ากว่าชุดเครื่องมือวิดเจ็ต ดั้งเดิม เนื่องจากมอบหมายการเรนเดอร์วิดเจ็ตให้กับAPI 2D ของ Java บริสุทธิ์ อย่างไรก็ตาม การทดสอบเปรียบเทียบประสิทธิภาพของ Swing กับชุดเครื่องมือวิดเจ็ตมาตรฐานซึ่งมอบหมายการเรนเดอร์ให้กับไลบรารี GUI ดั้งเดิมของระบบปฏิบัติการ แสดงให้เห็นว่าไม่มีผู้ชนะที่ชัดเจน และผลลัพธ์ขึ้นอยู่กับบริบทและสภาพแวดล้อมเป็นอย่างมาก[ 72 ]นอกจากนี้ เฟรมเวิร์ก JavaFX รุ่นใหม่ ซึ่งมีจุดประสงค์เพื่อทดแทน Swing ยังแก้ไขปัญหาหลายอย่างของ Swing อีก ด้วย
ใช้สำหรับการประมวลผลประสิทธิภาพสูง
บางคนเชื่อว่าประสิทธิภาพของ Java สำหรับการประมวลผลประสิทธิภาพสูง (HPC) นั้นคล้ายกับFortranในเกณฑ์มาตรฐานที่เน้นการคำนวณ แต่ JVM ยังคงมีปัญหาเรื่องความสามารถในการปรับขนาดสำหรับการสื่อสารที่เข้มข้นบนเครือข่ายการประมวลผลแบบกริด[ 73 ]
อย่างไรก็ตาม แอปพลิเคชันการประมวลผลประสิทธิภาพสูงที่เขียนด้วยภาษา Java ได้รับรางวัลชนะเลิศในการแข่งขันวัดประสิทธิภาพ ในปี 2551 [ 74 ]และ 2552 [ 75 ] [ 76 ] คลัสเตอร์ที่ใช้ Apache Hadoop (โครงการประมวลผลประสิทธิภาพสูงแบบโอเพนซอร์สที่เขียนด้วยภาษา Java) สามารถเรียงลำดับจำนวนเต็มขนาดเทราไบต์และเพตาไบต์ได้เร็วที่สุด อย่างไรก็ตาม การตั้งค่าฮาร์ดแวร์ของระบบที่เข้าร่วมแข่งขันไม่ได้ถูกกำหนดตายตัว[ 77 ] [ 78 ]
ในการแข่งขันเขียนโปรแกรม
โปรแกรมใน Java เริ่มทำงานช้ากว่าโปรแกรมในภาษาคอมไพล์อื่นๆ[ 79 ] [ 80 ]ดังนั้น ระบบตัดสินออนไลน์บางระบบ โดยเฉพาะระบบที่ดำเนินการโดยมหาวิทยาลัยในประเทศจีน จึงใช้เวลาจำกัดที่นานกว่าสำหรับโปรแกรม Java [ 81 ] [ 82 ] [ 83 ] [ 84 ] [ 85 ]เพื่อความเป็นธรรมต่อผู้เข้าแข่งขันที่ใช้ Java
ดูเพิ่มเติม
- รันไทม์ภาษาทั่วไป
- การวิเคราะห์ประสิทธิภาพ
- โปรเซสเซอร์ Javaคือโปรเซสเซอร์แบบฝังตัวที่รันไบต์โค้ด Java โดยตรง (เช่นJStik )
- การเปรียบเทียบ Java และ C++
- Java ConcurrentMap
การอ้างอิง
- ^ "การเปรียบเทียบประสิทธิภาพระหว่าง Java กับ C++ "
- ^ a b "คอมไพเลอร์ Java แบบ Just-In-Time ของ Symantec จะถูกรวมเข้ากับ Sun JDK 1.1"เก็บถาวรจากต้นฉบับเมื่อวันที่ 28 มิถุนายน 2010
- ^ "ข่าวสั้น: Apple ซื้อลิขสิทธิ์คอมไพเลอร์แบบ just-in-time ของ Symantec" . cnet.com. 12 พฤษภาคม 1998. สืบค้นเมื่อ15 พฤศจิกายน 2015 .
- ^ "Java เร็วขึ้นถึงสี่เท่าด้วยคอมไพเลอร์แบบ just-in-time ตัวใหม่จาก Symantec "
{{cite web}}: CS1 maint: บริการเก็บถาวรที่เลิกใช้แล้ว ( ลิงก์ ) - ^ "การเปรียบเทียบประสิทธิภาพของ Java/.NET Runtimes (ตุลาคม 2547) "
- ^คาวากุจิ, โคสุเกะ (30 มีนาคม 2551). "เจาะลึกโค้ดแอสเซมบลีจากภาษาจาวา" . เก็บถาวรจากต้นฉบับเมื่อ 2 เมษายน 2551 . เรียกดูเมื่อ2 เมษายน 2551 .
- ^ "การสร้างโค้ดที่รวดเร็วและมีประสิทธิภาพในคอมไพเลอร์ Java แบบ Just-In-Time" ( PDF)บริษัทIntel Corporation สืบค้นเมื่อ22 มิถุนายน 2550
- ^บทความนี้แสดงให้เห็นว่าประสิทธิภาพที่เพิ่มขึ้นระหว่างโหมดการตีความและ Hotspot นั้นมากกว่า 10 เท่า
- ^ประสิทธิภาพเชิงตัวเลขในภาษา C, C# และ Java
- ^การเปรียบเทียบประสิทธิภาพเชิงอัลกอริทึมระหว่างภาษาโปรแกรม C, C++, Java และ C# เก็บถาวรเมื่อวันที่ 31 มีนาคม 2010 ที่ Wayback Machine
- ^ "เครื่องเสมือน Java HotSpot เวอร์ชัน 1.4.1" . Sun Microsystems . สืบค้นเมื่อ20 เมษายน 2551 .
- ^ Nutter, Charles (28 มกราคม 2008). "Lang.NET 2008: ความคิดในวันแรก" . สืบค้นเมื่อ18 มกราคม 2011 .
การลดประสิทธิภาพเป็นเรื่องที่น่าตื่นเต้นมากเมื่อต้องรับมือกับปัญหาด้านประสิทธิภาพ เนื่องจากหมายความว่าคุณสามารถทำการปรับแต่งที่ก้าวร้าวมากขึ้นได้...โดยรู้ว่าคุณจะสามารถกลับไปใช้แนวทางที่ปลอดภัยและได้รับการพิสูจน์แล้วในภายหลังได้
- ^ไลบรารี IBM DeveloperWorks
- ^ตัวอย่างเช่น ระยะเวลาของการหยุดชั่วคราวจะสังเกตเห็นได้ยากขึ้นแล้ว ดูตัวอย่างเช่น เกมโคลน Quake II ที่ เขียนด้วยภาษา Java: Jake2
- ^ "คุณสมบัติใหม่ใน Java SE 6: ตัวตรวจสอบประเภทข้อมูล" . Java.net . สืบค้นเมื่อ18 มกราคม 2011 .
- ^ Brian Goetz (18 ตุลาคม 2548). "ทฤษฎีและการปฏิบัติของ Java: การเพิ่มประสิทธิภาพการซิงโครไนซ์ใน Mustang" . IBM . สืบค้นเมื่อ26 มกราคม 2556 .
- ^ "การปรับปรุงประสิทธิภาพของเครื่องเสมือน Java HotSpot" . Oracle Corporation . สืบค้นเมื่อ14 มกราคม 2014 .
การวิเคราะห์การหลีกเลี่ยง (Escape analysis) เป็นเทคนิคที่คอมไพเลอร์ของ Java Hotspot Server สามารถวิเคราะห์ขอบเขตการใช้งานของวัตถุใหม่และตัดสินใจว่าจะจัดสรรให้กับวัตถุนั้นบนฮีปของ Java หรือไม่ การวิเคราะห์การหลีกเลี่ยงได้รับการสนับสนุนและเปิดใช้งานโดยค่าเริ่มต้นใน Java SE 6u23 และเวอร์ชันที่ใหม่กว่า
- ^รายงานข้อผิดพลาด: ตัวจัดสรรรีจิสเตอร์ใหม่ แก้ไขแล้วใน Mustang (JDK 6) b59
- ^โปรแกรม HotSpot Client ของ Mustang เร็วขึ้น 58%! (เก็บถาวรเมื่อวันที่ 5 มีนาคม 2012 ใน Wayback Machineจากบล็อกของ Osvaldo Pinali Doederlein ที่ java.net)
- ^การแชร์ข้อมูลคลาสที่ java.sun.com
- ^การแชร์ข้อมูลคลาสใน JDK 1.5.0ในฟอรัม Java Buzz ที่ artima developer
- ^ Mckay, Niali. "Java เร็วขึ้นสี่เท่าด้วยคอมไพเลอร์แบบ just-in-time ตัวใหม่ของ Symantec" .
- ^ภาพรวมของ Sun เกี่ยวกับการปรับปรุงประสิทธิภาพระหว่างเวอร์ชัน 1.4 และ 5.0
- ^ STR-Crazier: การปรับปรุงประสิทธิภาพใน Mustang เก็บถาวรเมื่อวันที่ 5 มกราคม 2550 ที่ Wayback Machineในบล็อกของ Chris Campbell ที่ java.net
- ^ดูที่นี่สำหรับผลการทดสอบประสิทธิภาพที่แสดงให้เห็นถึงการเพิ่มประสิทธิภาพประมาณ 60% จาก Java 5.0 เป็น 6 สำหรับแอปพลิเคชัน JFreeChart
- ^เอกสารไวท์เปเปอร์เกี่ยวกับประสิทธิภาพของ Java SE 6ที่ http://java.sun.com
- ^ a b Haase, Chet (พฤษภาคม 2550). "Consumer JRE: เทคโนโลยี Java ที่คล่องตัวและมีประสิทธิภาพยิ่งขึ้น" . Sun Microsystems . สืบค้นเมื่อ27 กรกฎาคม 2550 .
ในระดับระบบปฏิบัติการ ข้อมูลขนาดหลายเมกะไบต์เหล่านี้จะต้องถูกอ่านจากดิสก์ ซึ่งเป็นกระบวนการที่ช้ามาก อันที่จริงแล้ว เวลาในการค้นหาข้อมูลบนดิสก์เป็นตัวการสำคัญ การอ่านไฟล์ขนาดใหญ่แบบเรียงลำดับนั้นค่อนข้างเร็ว แต่การค้นหาบิตที่เราต้องการจริงๆ นั้นช้า ดังนั้นถึงแม้ว่าเราจะต้องการเพียงเศษเสี้ยวเล็กๆ ของข้อมูลในไฟล์ขนาดใหญ่เหล่านี้สำหรับแอปพลิเคชันใดๆ ก็ตาม แต่ข้อเท็จจริงที่ว่าเรากำลังค้นหาข้อมูลทั่วทั้งไฟล์หมายความว่ามีการใช้งานดิสก์เป็นจำนวนมาก
- ^ Haase, Chet (พฤษภาคม 2550). "Consumer JRE: Leaner, Meaner Java Technology" . Sun Microsystems . สืบค้นเมื่อ27 กรกฎาคม 2550 .
- ^ Haase, Chet (พฤษภาคม 2550). "Consumer JRE: Leaner, Meaner Java Technology" . Sun Microsystems . สืบค้นเมื่อ27 กรกฎาคม 2550 .
- ^แคมป์เบลล์, คริส (7 เมษายน 2550). "การประมวลผล Java 2D ให้เร็วขึ้นด้วย Shaders" . เก็บถาวรจากต้นฉบับเมื่อ 5 มิถุนายน 2554 . เรียกดูเมื่อ18 มกราคม 2554 .
- ^ Haase, Chet (พฤษภาคม 2550). "Consumer JRE: Leaner, Meaner Java Technology" . Sun Microsystems . สืบค้นเมื่อ27 กรกฎาคม 2550 .
- ^ "JSR 292: การสนับสนุนภาษาที่มีการกำหนดประเภทแบบไดนามิกบนแพลตฟอร์ม Java" . jcp.org . สืบค้นเมื่อ28 พฤษภาคม 2551 .
- ^ Goetz, Brian (4 มีนาคม 2551). "ทฤษฎีและการปฏิบัติของ Java: จบแล้ว ตอนที่ 2" . IBM . สืบค้นเมื่อ9 มีนาคม 2551 .
- ^ Lorimer, RJ (21 มีนาคม 2551). "การประมวลผลแบบขนานด้วย Fork/Join ใน Java 7" . infoq.com . สืบค้นเมื่อ28 พฤษภาคม 2551 .
- ^ "การปรับปรุงประสิทธิภาพคอมไพเลอร์ใหม่ในเครื่องเสมือน Java HotSpot" (PDF) . Sun Microsystems. พฤษภาคม 2549. สืบค้นเมื่อ30 พฤษภาคม 2551 .
- ^ Humble, Charles (13 พฤษภาคม 2551). "JavaOne: Garbage First" . infoq.com . สืบค้นเมื่อ7 กันยายน 2551 .
- ^ Coward, Danny (12 พฤศจิกายน 2008). "Java VM: ลองใช้ Garbage Collector ตัวใหม่สำหรับ JDK 7" . เก็บถาวรจากต้นฉบับเมื่อ 8 ธันวาคม 2011 . เรียกดูเมื่อ15 พฤศจิกายน 2008 .
- ^ "เกมทดสอบประสิทธิภาพภาษาคอมพิวเตอร์" benchmarksgame.alioth.debian.org. เก็บถาวรจากต้นฉบับเมื่อวันที่ 25 มกราคม 2015 เรียกดูเมื่อวันที่ 2 มิถุนายน 2011
- ^ "เกมทดสอบประสิทธิภาพภาษาคอมพิวเตอร์" benchmarksgame.alioth.debian.org. เก็บถาวรจากต้นฉบับเมื่อวันที่ 13 มกราคม 2015 เรียกดูเมื่อวันที่ 2 มิถุนายน 2011
- ^ "เกมทดสอบประสิทธิภาพภาษาคอมพิวเตอร์" benchmarksgame.alioth.debian.org. เก็บถาวรจากต้นฉบับเมื่อวันที่ 10 มกราคม 2015 เรียกดูเมื่อวันที่ 2 มิถุนายน 2011
- ^ "เกมทดสอบประสิทธิภาพภาษาคอมพิวเตอร์" benchmarksgame.alioth.debian.org. เก็บถาวรจากต้นฉบับเมื่อวันที่ 2 มกราคม 2015 เรียกดูเมื่อวันที่ 2 มิถุนายน 2011
- ^ : 260/250เฟรม/วินาทีเทียบกับ 245 เฟรม/วินาที (ดูผลการทดสอบ )
- ^ Hundt, Robert. "การจดจำลูปใน C++/Java/Go/Scala" (PDF) . Scala Days 2011 . Stanford, California . สืบค้นเมื่อ23 มีนาคม 2014 .
- ^ L. Gherardi; D. Brugali; D. Comotti (2012). "การประเมินประสิทธิภาพ Java เทียบกับ C++: เกณฑ์มาตรฐานการสร้างแบบจำลอง 3 มิติ" (PDF)มหาวิทยาลัยเบอร์กาโมสืบค้นเมื่อ23 มีนาคม 2014
การใช้คอมไพเลอร์เซิร์ฟเวอร์ ซึ่งได้รับการปรับแต่งมาอย่างดีที่สุดสำหรับแอปพลิเคชันที่ทำงานต่อเนื่องยาวนาน ได้แสดงให้เห็นว่า Java ช้ากว่า 1.09 ถึง 1.91 เท่า (...) โดยสรุป ผลลัพธ์ที่ได้จากคอมไพเลอร์เซิร์ฟเวอร์และคุณสมบัติที่สำคัญเหล่านี้ชี้ให้เห็นว่า Java สามารถพิจารณาเป็นทางเลือกที่เหมาะสมสำหรับ C++
ได้ - ^ Lewis, JP; Neumann, Ulrich. "ประสิทธิภาพของ Java เทียบกับ C++" . ห้องปฏิบัติการคอมพิวเตอร์กราฟิกและเทคโนโลยีเสมือนจริง มหาวิทยาลัยเซาท์เทิร์นแคลิฟอร์เนีย
- ^ "ตัวอย่างการแทรกเมธอดใน Java HotSpot Performance Engine" . Oracle Corporation . สืบค้นเมื่อ11 มิถุนายน 2011 .
- ^ Nutter, Charles (3 พฤษภาคม 2008). "พลังของ JVM" . สืบค้นเมื่อ11 มิถุนายน 2011 .
จะเกิดอะไรขึ้นถ้าคุณได้ทำการอินไลน์เมธอดของ A ไปแล้วเมื่อ B เข้ามา? ในกรณีนี้ JVM ก็แสดงความสามารถอีกครั้ง เพราะ JVM นั้นโดยพื้นฐานแล้วเป็นรันไทม์ภาษาแบบไดนามิกที่อยู่เบื้องหลัง มันจึงคอยเฝ้าระวังอยู่เสมอ คอยจับตาดูเหตุการณ์ประเภทนี้ที่จะเกิดขึ้น และนี่คือส่วนที่เจ๋งจริงๆ: เมื่อสถานการณ์เปลี่ยนไป JVM สามารถลดประสิทธิภาพลงได้ นี่เป็นรายละเอียดที่สำคัญมาก รันไทม์อื่นๆ หลายตัวสามารถทำการปรับแต่งได้เพียงครั้งเดียวเท่านั้น คอมไพเลอร์ C ต้องทำการปรับแต่งทั้งหมดล่วงหน้าในระหว่างการสร้าง บางตัวอนุญาตให้คุณทำการวิเคราะห์ประสิทธิภาพของแอปพลิเคชันและป้อนข้อมูลนั้นลงในการสร้างครั้งต่อไป แต่เมื่อคุณปล่อยโค้ดออกมาแล้ว มันก็ได้รับการปรับแต่งให้ดีที่สุดเท่าที่จะเป็นไปได้แล้ว ระบบที่คล้ายกับ VM อื่นๆ เช่น CLR ก็มีขั้นตอน JIT แต่จะเกิดขึ้นในช่วงต้นของการทำงาน (อาจจะก่อนที่ระบบจะเริ่มทำงานด้วยซ้ำ) และจะไม่เกิดขึ้นอีกเลย ความสามารถของ JVM ในการลดประสิทธิภาพและกลับไปสู่การตีความ ทำให้มันมีพื้นที่สำหรับการมองโลกในแง่ดี...มีพื้นที่สำหรับการคาดเดาที่ทะเยอทะยานและถอยกลับไปสู่สถานะที่ปลอดภัยอย่างนุ่มนวล เพื่อลองใหม่อีกครั้งในภายหลัง
- ^ " การทดสอบประสิทธิภาพระดับไมโครของ C++, C# และ Java: การคำนวณเลขจำนวนเต็ม 32 บิต"วารสารของดร.ด็อบบ์ 1 กรกฎาคม 2548 สืบค้นเมื่อ18 มกราคม 2554
- ^ " การทดสอบประสิทธิภาพระดับไมโครของ C++, C# และ Java: การคำนวณเลขฐานสอง 64 บิต"วารสารของดร.ด็อบบ์ 1 กรกฎาคม 2548 สืบค้นเมื่อ18 มกราคม 2554
- ^ "การทดสอบประสิทธิภาพระดับไมโคร ของC++, C# และ Java: การรับส่งข้อมูลไฟล์"วารสารของดร.ด็อบบ์ 1 กรกฎาคม 2548 สืบค้นเมื่อ18 มกราคม 2554
- ^ "การ ทดสอบประสิทธิภาพระดับไมโครของ C++, C# และ Java: ข้อยกเว้น"วารสารของดร.ด็อบบ์ 1 กรกฎาคม 2548 สืบค้นเมื่อ18 มกราคม 2554
- ^ "การทดสอบประสิทธิภาพระดับไมโคร ของC++, C# และ Java: Array"วารสารของดร.ด็อบบ์ 1 กรกฎาคม 2548 สืบค้นเมื่อ18 มกราคม 2554
- ^ "การ ทดสอบประสิทธิภาพระดับไมโครของ C++, C# และ Java: ฟังก์ชันตรีโกณมิติ"วารสารของดร.ด็อบบ์ 1 กรกฎาคม 2548 สืบค้นเมื่อ18 มกราคม 2554
- ^ Yi Zhao, Jin Shi, Kai Zheng, Haichuan Wang, Haibo Lin และ Ling Shao,กำแพงการจัดสรร: ปัจจัยจำกัดของแอปพลิเคชัน Java บนแพลตฟอร์มมัลติคอร์ที่กำลังเกิดขึ้นใหม่ , รายงานการประชุม ACM SIGPLAN ครั้งที่ 24 ว่าด้วยระบบภาษาและแอปพลิเคชันการเขียนโปรแกรมเชิงวัตถุ, 2009
- ^ "C4: เครื่องเก็บรวบรวมขยะแบบอัดแน่นที่ทำงานพร้อมกันอย่างต่อเนื่อง" (PDF) . เก็บถาวรจากต้นฉบับ(PDF)เมื่อวันที่ 9 สิงหาคม 2557 . เรียกดูเมื่อวันที่ 29 ตุลาคม 2556 .
- ^ Azul เอาชนะ Java ด้วยเครื่องที่มี 768 คอร์
- ^ "การทดสอบประสิทธิภาพการเริ่มต้นระบบและการทำงานของระบบสำหรับ .Net, Mono, Java, C++ และ UI ของแต่ละภาษา" 2 กันยายน 2010
- ^ "ระบบตรวจสอบความถูกต้องตัวใหม่เร็วแค่ไหน?" 7 กุมภาพันธ์ 2549 เก็บถาวรจากต้นฉบับเมื่อ 16 พฤษภาคม 2549 เรียกดูเมื่อ 9 พฤษภาคม 2550
- ^ปืนยิงตะปู
- ^ หน้า ข้อมูลพื้นฐานของ Nailgunแสดงให้เห็นถึงความเร็วที่เพิ่มขึ้นใน "สถานการณ์ที่ดีที่สุด " คือ 33 เท่า (สำหรับโปรแกรม "Hello, World!" ที่เขียนด้วยสคริปต์ เช่น โปรแกรมที่ทำงานในระยะเวลาสั้นๆ)
- ^ "วิธีการคำนวณการใช้หน่วยความจำของอ็อบเจ็กต์ Java "
- ^ "InformIT: คู่มืออ้างอิง C++ > โมเดลวัตถุ" . เก็บถาวรจากต้นฉบับเมื่อวันที่ 21 กุมภาพันธ์ 2551 . เรียกดูเมื่อวันที่ 22 มิถุนายน 2552 .
- ^ https://www.youtube.com/watch?v=M91w0SBZ-wc : ทำความเข้าใจการจัดการหน่วยความจำอัตโนมัติ (Garbage Collection) ในภาษา Java - การบรรยายโดย Gil Tene ที่งาน JavaOne
- ^ ".: ToMMTi-Systems :: Hinter den Kulissen ที่ทันสมัยกว่า 3D-Hardware "
- ^ "คณิตศาสตร์ (Java Platform SE 6)" . Sun Microsystems . สืบค้นเมื่อ8 มิถุนายน 2551 .
- ^กอสลิง, เจมส์ (27 กรกฎาคม 2548). "การทำสมาธิแบบเหนือธรรมชาติ" . เก็บถาวรจากต้นฉบับเมื่อ 12 สิงหาคม 2554 . สืบค้นเมื่อ8 มิถุนายน 2551 .
- ^ Cowell-Shah, Christopher W. (8 มกราคม 2547). "สรุปผลการทดสอบประสิทธิภาพ 9 ภาษา: การวัดประสิทธิภาพทางคณิตศาสตร์และการรับส่งข้อมูลไฟล์" . เก็บถาวรจากต้นฉบับเมื่อ 11 ตุลาคม 2561 . สืบค้นเมื่อ8 มิถุนายน 2551 .
- ^วิลสัน, สตีฟ; เจฟฟ์ เคสเซลแมน (2001). "ประสิทธิภาพแพลตฟอร์ม Java™: การใช้โค้ดเนทีฟ" . ซัน ไมโครซิสเต็มส์. สืบค้นเมื่อ15 กุมภาพันธ์ 2008 .
- ^ Kurzyniec, Dawid; Vaidy Sunderam. "ความร่วมมือที่มีประสิทธิภาพระหว่าง Java และโค้ดเนทีฟ - เกณฑ์มาตรฐานประสิทธิภาพ JNI" (PDF) . เก็บถาวรจากต้นฉบับ(PDF)เมื่อวันที่ 14 กุมภาพันธ์ 2548 . เรียกดูเมื่อวันที่ 15 กุมภาพันธ์ 2551 .
- ^ Bloch 2018 , หน้า 285, บทที่ 11 ข้อ 66: ใช้วิธีการดั้งเดิมอย่างรอบคอบ
- ^ "ประสิทธิภาพของ JNA เมื่อเทียบกับ JNI แบบกำหนดเองเป็นอย่างไร?" . Sun Microsystems . สืบค้นเมื่อ26 ธันวาคม 2552 .
- ^ Igor, Križnar (10 พฤษภาคม 2548). "การเปรียบเทียบประสิทธิภาพ SWT กับ Swing" (PDF) . cosylab.com. เก็บถาวรจากต้นฉบับ(PDF)เมื่อวันที่ 4 กรกฎาคม 2551 . สืบค้น เมื่อ 24 พฤษภาคม 2551 .
เป็นเรื่องยากที่จะกำหนดกฎเกณฑ์ตายตัวว่า SWT จะมีประสิทธิภาพเหนือกว่า Swing หรือในทางกลับกัน ในบางสภาพแวดล้อม (เช่น Windows) SWT เป็นผู้ชนะ ในสภาพแวดล้อมอื่นๆ (Linux,
VMware
ที่โฮสต์ Windows) Swing และการเพิ่มประสิทธิภาพการวาดใหม่ของ Swing มีประสิทธิภาพเหนือกว่า SWT อย่างมาก ความแตกต่างในประสิทธิภาพนั้นมีนัยสำคัญ: ปัจจัย 2 เท่าขึ้นไปเป็นเรื่องปกติ ไม่ว่าจะในทิศทางใดก็ตาม
- ^ Brian Amedro; Vladimir Bodnartchouk; Denis Caromel; Christian Delbe; Fabrice Huet; Guillermo L. Taboada (สิงหาคม 2551). "สถานะปัจจุบันของ Java สำหรับ HPC" . INRIA . สืบค้นเมื่อ9 กันยายน 2551 .
ก่อนอื่น เราได้ทำการทดสอบประสิทธิภาพขนาดเล็กสำหรับ JVM ต่างๆ ซึ่งแสดงให้เห็นถึงประสิทธิภาพโดยรวมที่ดีสำหรับการคำนวณทางคณิตศาสตร์พื้นฐาน(...). เมื่อเปรียบเทียบการใช้งานนี้กับการใช้งาน Fortran/MPI เราพบว่ามีประสิทธิภาพที่คล้ายคลึงกันในการทดสอบประสิทธิภาพที่เน้นการคำนวณ แต่ยังคงมีปัญหาเรื่องความสามารถในการปรับขนาดเมื่อทำการสื่อสารอย่างเข้มข้น
- ^ Owen O'Malley - ทีมประมวลผลแบบกริดของ Yahoo! (กรกฎาคม 2551). "Apache Hadoop ชนะการทดสอบประสิทธิภาพการเรียงลำดับข้อมูลระดับเทราไบต์" . เก็บถาวรจากต้นฉบับเมื่อวันที่ 15 ตุลาคม 2552 . เรียกดูเมื่อวันที่ 21 ธันวาคม 2551 .
นี่เป็นครั้งแรกที่โปรแกรม Java หรือโปรแกรมโอเพนซอร์สชนะการทดสอบนี้
- ^ "Hadoop เรียงลำดับข้อมูลขนาดเพตาไบต์ได้ใน 16.25 ชั่วโมง และขนาดเทราไบต์ได้ใน 62 วินาที" . CNET.com . 11 พฤษภาคม 2552. เก็บถาวรจากต้นฉบับเมื่อวันที่ 16 พฤษภาคม 2552. เรียกดูเมื่อวันที่ 8 กันยายน 2553.
รายละเอียดฮาร์ดแวร์และระบบปฏิบัติการมีดังนี้:(...)Sun Java JDK (1.6.0_05-b13 และ 1.6.0_13-b03) (32 และ 64 บิต)
- ^ "Hadoop ทำลายสถิติโลกด้านการจัดเรียงข้อมูล" . CNET.com . 15 พฤษภาคม 2552 . สืบค้นเมื่อ8 กันยายน 2553 .
- ^คริส ไนเบิร์ก; เมฮุล ชาห์. "หน้าแรกของ Sort Benchmark" . สืบค้นเมื่อ30 พฤศจิกายน 2010 .
- ↑แชจโคว์สกี้, Grzegorz (21 พฤศจิกายน พ.ศ. 2551) "การเรียงลำดับ 1PB ด้วย MapReduce " สืบค้นเมื่อวันที่ 1 ธันวาคม 2010 .
- ^ "TCO10" . เก็บถาวรจากต้นฉบับเมื่อวันที่ 18 ตุลาคม 2010 . เรียกดูเมื่อวันที่ 21 มิถุนายน 2010 .
- ^ "วิธีการเขียนคำตอบด้วยภาษา Java สำหรับ Timus Online Judge "
- ^ "คำถามที่พบบ่อย "
- ^ "คำถามที่พบบ่อย | TJU ACM-ICPC Online Judge" . เก็บถาวรจากต้นฉบับเมื่อวันที่ 29 มิถุนายน 2010 . เรียกดูเมื่อวันที่ 25 พฤษภาคม 2010 .
- ^ "คำถามที่พบบ่อย | CodeChef "
- ^ "หน้าแรกของระบบตัดสินออนไลน์ มหาวิทยาลัยซีเตียน"เก็บถาวรจากต้นฉบับเมื่อวันที่ 19 กุมภาพันธ์ 2555 เรียกดูเมื่อวันที่ 13 พฤศจิกายน 2554
- ^ "คำถามที่พบบ่อย "
ลิงก์ภายนอก
- เว็บไซต์ที่รวบรวมข้อมูลเกี่ยวกับประสิทธิภาพของ Java
- การแก้ไขปัญหาประสิทธิภาพของ Java
- พอร์ทัลประสิทธิภาพ Java ของ Sun
- แผนผังความคิด (Mind-map) ที่สร้างขึ้นจากงานนำเสนอของวิศวกรในสาขา Oracle SPb (ในรูปแบบไฟล์ PNG ขนาดใหญ่)
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ ประสิทธิภาพของ Java
ใน การพัฒนาซอฟต์แวร์ ภาษาโปรแกรม Java ถือว่าช้ากว่า ภาษา ประเภทเจเนอเร ชั่นที่สามที่ เร็วที่สุด เช่น C และ C++ [ 1 ] ในทางตรงกันข้ามกับภาษาเหล่านั้น Java จะคอมไพล์เป็น Java...
วิธีการเพิ่มประสิทธิภาพเครื่องเสมือน
การปรับปรุงประสิทธิภาพหลายอย่างได้ช่วยเพิ่มประสิทธิภาพของ JVM ตลอดเวลาที่ผ่านมา อย่างไรก็ตาม แม้ว่า Java มักจะเป็น เครื่องเสมือน แรก ที่นำการปรับปรุงเหล่านั้นมาใช้ได้สำเร็จ แต่การปรับปรุงเหล่านั้นก็มักถูกนำไปใช้ในแพลตฟอร์มอื่นๆ ที่คล้ายคลึงกันด้วยเช่นกัน
การคอมไพล์แบบทันเวลาพอดี
JVM รุ่นแรกๆ มักจะตีความ ไบต์โค้ดของ Java เสมอ ซึ่งส่งผลเสียต่อประสิทธิภาพอย่างมาก โดยมีประสิทธิภาพลดลงระหว่าง 10 ถึง 20 เท่าเมื่อเทียบกับ C ในแอปพลิเคชันทั่วไป [ 5 ] เพื่อแก้ไขปัญหานี้ จึงมีการนำคอมไพเลอร์แบบ Just-in-Time (JIT) มาใช้ใน Java 1.
การเพิ่มประสิทธิภาพแบบปรับตัวได้
การเพิ่มประสิทธิภาพแบบปรับตัวได้ (Adaptive optimizing) เป็นวิธีการในวิทยาการคอมพิวเตอร์ที่ทำการ คอมไพล์ ส่วนต่างๆ ของโปรแกรมใหม่แบบไดนามิกโดยอิงจากโปรไฟล์การทำงานปัจจุบัน ในการใช้งานแบบง่ายๆ...