การอัพเกรดโค้ดที่คอมไพล์ Java 7 เป็น Java 8 มีประโยชน์หรือไม่?


127

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

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


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


2
เพียงเพื่อให้ชัดเจน โค้ดทำงานด้วย 1.8 JRE ล่าสุดแล้วดังนั้นจึงมีการแก้ไขข้อบกพร่อง Java 8 ล่าสุดและการปรับปรุงประสิทธิภาพรันไทม์ทั้งหมด (ตามความรู้ของฉัน)
g8torPaul

4
นี่เป็นคำถามที่น่าจะมากกว่าเกี่ยวกับ bytecode ที่คอมไพเลอร์ส่งออก อาจทำให้คำถามของคุณชัดเจนขึ้น
M Platvoet

2
ประสิทธิภาพการทำงานของนักพัฒนาที่ดีขึ้นจึงไม่เกี่ยวข้องที่นี่?
Mick Mnemonic

7
"ฉันไม่ได้วางแผนที่จะเขียนโค้ดใหม่" จะไม่ชัดเจนได้อย่างไรฉันไม่อยากจะเชื่อ
eldo

3
สิ่งนี้อาจเกี่ยวข้องกันบ้าง: stackoverflow.com/questions/21732290/…
Arnaud

คำตอบ:


82

ถ้าฉันเข้าใจคำถามอย่างถูกต้องคุณต้องการทราบว่า bytecode ที่สร้างโดยjavacJava 8 จะ "ดีกว่า" ใน Java 7 หรือไม่

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

เว็บไซต์ Oracle เป็นที่น่ากลัวและฉันไม่สามารถดูเหมือนจะได้รับรายชื่อของการแก้ไขข้อบกพร่องที่เกี่ยวข้องกับการjavacระหว่างรุ่น แต่ที่นี่เป็นหนึ่งที่ครบถ้วนสมบูรณ์ไม่ใช่จาก OpenJDK สิ่งที่ฉันจัดการได้ส่วนใหญ่พบคือการแก้ไขข้อผิดพลาด ดังนั้นการอัปเดตเป็น Java 8 จึงมีโอกาสที่จะไม่คอมไพล์อีกต่อไปเนื่องจากการปฏิบัติjavacตาม JLS อย่างถูกต้องมากขึ้นและจะมีการ "ปรับปรุง" ไบต์โค้ดน้อยมากที่ไม่มีเลย


4
ขอบคุณฉันได้ตรวจสอบรายการบางส่วนใน OpenJDK แล้วและไม่มีอะไรโดดเด่นที่นั่นนอกจากดูเหมือนว่าพวกเขาได้ปรับปรุงประสิทธิภาพของ javac แล้ว ฉันยอมรับว่าเป็นไปไม่ได้ที่จะค้นหาการแก้ไข / คุณสมบัติที่สมเหตุสมผลระหว่างเวอร์ชันของ Java บนเว็บไซต์ Oracles รูปแบบของบันทึกประจำรุ่นสำหรับแต่ละเวอร์ชันไม่สอดคล้องกันแม้แต่น้อย ลำไส้ของฉันบอกฉันว่าไม่มีประโยชน์ทางเทคนิคในการคอมไพล์กับ JDK 8 กับ JDK 7
g8torPaul

1
@ g8torPaul เว้นแต่คุณจะใช้คุณสมบัติที่มีเฉพาะใน Java 8 เท่านั้นเช่น lamdbas / stream
Peter Lawrey

21

ประโยชน์หลักคือ Java 8 มีการแก้ไขข้อบกพร่องล่าสุดโดยที่ Java 7 ไม่ได้รับการอัปเดตต่อสาธารณะ

นอกจากนี้หากคุณกำลังจะรันโค้ดบน Java 8 JVM คุณอาจติดตั้ง Java เพียงเวอร์ชันเดียว

Java 8 อาจเร็วกว่าและรองรับคุณสมบัติใหม่ ๆ เช่น G1 ได้ดีกว่า อย่างไรก็ตามกรณีการใช้งานของคุณอาจช้าลงดังนั้นวิธีเดียวที่จะทราบได้คือการทดสอบ

มีประโยชน์ทางเทคนิคในการอัพเกรดโค้ดที่คอมไพล์แล้วเป็น Java 8 JDK ล่าสุดหรือไม่?

หากคุณกำลังถามว่าการคอมไพล์โค้ด Java 7 ใหม่ในคอมไพเลอร์ Java 8 มีประโยชน์หรือไม่คำตอบคือ แทบไม่มีอะไรเลย

ข้อแตกต่างที่ลึกซึ้งเพียงอย่างเดียวคือมีความแตกต่างเล็กน้อยกับ Java API ดังนั้นอาจมีความแตกต่างเล็กน้อยคอมไพเลอร์ Java 8 อาจพบว่า Java 7

ความแตกต่างเล็กน้อยอื่น ๆ คือหมายเลขวิเศษที่จุดเริ่มต้นของไฟล์ซึ่งอาจเป็นลำดับของพูลคงที่ โดยพื้นฐานแล้วรหัสไบต์นั้นเหมือนกันแม้กระทั่งการรองรับinvokedynamicที่เพิ่มสำหรับ lambdas ก็มีอยู่ใน Java 7 แต่ก็ไม่ได้ใช้แบบนั้น


8
แก้ไขฉันถ้าฉันผิด แต่ OP ถามเกี่ยวกับการคอมไพล์โค้ดใหม่ด้วย Java 8 ในขณะที่คำตอบของคุณคือจะใช้ Java 8 ในการดำเนินการหรือไม่
tobias_k

5
ฉันกำลังทำงานภายใต้ Java 1.8 JRE ล่าสุด การแก้ไขข้อบกพร่องและโค้ด Java ภายในทั้งหมดจะมีให้โดย JRE ฉันไม่คิดว่าสิ่งนี้จะตอบคำถามของฉันได้
g8torPaul

16
สิ่งนี้ไม่ตอบคำถาม หาก "แทบไม่มีอะไรเลย" โปรดชี้แจงว่าความแตกต่างคืออะไร มิฉะนั้นก็แค่คาดเดา
M Platvoet

1
@Peter Lawrey คุณบอกว่า ".. คำตอบคือแทบไม่มีอะไรเลย". เรามีหลักฐานสนับสนุนสิ่งนั้นหรือไม่? BTW ฉันมักจะเห็นด้วยกับคุณ
g8torPaul

2
@ g8torPaul Java 8 ได้รับการออกแบบให้เข้ากันได้กับ Java 7 แบบย้อนหลังและหากคุณไม่ได้ใช้คุณสมบัติใด ๆ ของ Java 8 ก็ควรสร้างโค้ดไบต์ที่เหมือนกันเกือบทุกประการ
Peter Lawrey

21

มันอาจช่วยให้โดยการสร้างความตระหนัก

เมื่อคุณเปลี่ยนไปใช้ Java8 คุณอาจพบคำเตือนเพิ่มเติมที่ปล่อยออกมาโดย javac ตัวอย่าง: การอนุมานประเภทได้รับการปรับปรุงอย่างมากด้วย Java8 และนั่นสามารถขจัดความจำเป็นในการใช้คำอธิบายประกอบ @SuppressWarnings ในฐานรหัสปัจจุบันของคุณ (และเมื่อไม่จำเป็นต้องใช้คำอธิบายประกอบดังกล่าวอีกต่อไปคอมไพเลอร์จะเตือนเกี่ยวกับเรื่องนั้น)

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

ในทางกลับกัน:

  • ฉันเห็นคำถามบางอย่างเกี่ยวกับสถานการณ์ (หายาก) ที่ Java8 ปฏิเสธที่จะคอมไพล์โค้ด Java7 ดังนั้นการเปลี่ยนไปใช้ Java8 ยังมีความเสี่ยง (น้อยที่สุด) ที่จะพบปัญหาประเภทนั้น
  • และ: แม้ว่าคุณจะไม่ได้ตั้งใจจะแตะฐานรหัสของคุณในวันนี้แต่ก็มีโอกาสที่คุณจะเปลี่ยนใจในภายหลัง จากนั้นเมื่อไม่ใส่ใจคุณอาจใช้ประโยชน์จากคุณสมบัติ Java8 ซึ่งอาจทำให้ "การอัปเดตฟิลด์" ซับซ้อน; เนื่องจากตอนนี้คุณมีซอร์สโค้ดสองเวอร์ชันที่ต้องดูแล!
  • จากนั้น: ในกรณีที่คุณมีลูกค้าเรียกใช้ผลิตภัณฑ์โดยใช้ java7 jre; คุณต้องระวังอย่างมากเกี่ยวกับการแก้ไขไบนารีที่คุณให้กับพวกเขา เรามีการตั้งค่าดังกล่าว และฉันเสียเวลาไปมากกว่าหนึ่งครั้งเพราะบังเอิญใส่คลาสที่คอมไพล์ Java8 ตัวเดียวลงในระบบทดสอบที่ขับเคลื่อนด้วย Java7 โดยไม่ได้ตั้งใจ นั่นไม่สามารถเกิดขึ้นได้เมื่อการตั้งค่า dev และการทดสอบ / ลูกค้าของคุณเป็น Java7 ทั้งหมด

เรื่องสั้นขนาดยาว: มีข้อดีเล็กน้อยและความเสี่ยงบางอย่าง (ซึ่งความสำคัญของความเสี่ยงส่วนใหญ่ขึ้นอยู่กับการตั้งค่าโดยรวมของคุณ)


2
ตัวอย่างหนึ่งของปัญหา "Java8 ปฏิเสธที่จะคอมไพล์ Java7" ที่หายาก: stackoverflow.com/q/41590024/2513200 (ปัญหาที่ทราบของ Oracle Compiler มีผลกับ Java 8 เท่านั้น แต่ไม่มีทั้ง 7 หรือ 9)
Hulk

8

ฉันจะทำเพื่อข้อเท็จจริงเหล่านี้เป็นอย่างน้อย

1) HashMap ภายใน (เร็วกว่าภายใต้ jdk-8)

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

3) G1 เครื่องเก็บขยะ

แก้ไข

จากมุมมองทางเทคนิคสิ่งนี้ดูเหมือนจะทำกับAhead of Time Compilationหรือสิ่งที่คอมไพเลอร์อาจปรับปรุงโดยการวิเคราะห์โค้ดให้มากขึ้น เท่าที่ฉันรู้สิ่งเหล่านี้ไม่ได้ทำในคอมไพเลอร์ java 8

จากมุมมองของนักพัฒนา - มีมากมาย ผลผลิตที่เพิ่มขึ้นเป็นสิ่งที่สำคัญที่สุดสำหรับฉัน

แก้ไข 2

ฉันรู้เพียงสองจุดที่ตรงกับคำถามที่สองของคุณ:

-parameters

เพื่อรักษาชื่อพารามิเตอร์เมธอด

-ข้อมูลส่วนตัว

เรียกว่าCompact Profile Optionสำหรับพื้นที่ขนาดเล็ก


26
จะไม่ทำงาน ภายใต้ Java 8 แล้วให้ประโยชน์เหล่านี้หรือไม่? คำถามที่แท้จริงน่าจะเป็น "ฉันสามารถเขียนบางสิ่งใน Java 8 ที่ทำงานได้ดีกว่า Java 7 ที่เทียบเท่า"
Jorn Vernee

8
ฉันกำลังทำงานภายใต้ Java 1.8 JRE ล่าสุด การแก้ไขข้อบกพร่องและโค้ด Java ภายในทั้งหมดจะมีให้โดย JRE พนักงานเก็บขยะยังเป็นส่วนหนึ่งของ JRE ฉันไม่คิดว่าสิ่งนี้จะตอบคำถามของฉันได้
g8torPaul

8
@JornVernee OPs กล่าวอย่างชัดเจนว่าเขาไม่ต้องการเขียนอะไรใหม่ดังนั้นคำถามที่ฉันเข้าใจก็คือ "คอมไพเลอร์ Java 8 สามารถทำเทคนิคใด ๆ ที่คอมไพเลอร์ Java 7 ไม่สามารถทำได้"
tobias_k

2
@JornVernee คำถามคือถ้าโค้ดที่เขียนใน Java 7 และคอมไพล์ใน Java 8 ทำงานได้ดีขึ้นโค้ดที่คอมไพล์ใน Java 7
EarlGrey

6
ไม่ตอบคำถามและคาดเดาเพียงว่ายังไม่ดีขึ้น
M Platvoet

-1

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

อย่างไรก็ตามหากคุณต้องคอมไพล์ใหม่เพียงครั้งเดียวให้พิจารณาสิ่งนี้:

  • ซอร์สโค้ดแอปพลิเคชันของคุณเข้ากันได้กับ Java 7 และน่าจะเป็น 8 ด้วย
  • ในกรณีที่โค้ดไม่ได้คอมไพล์กับ Java 8 อาจไม่สามารถคอมไพล์กับคอมไพเลอร์ Java 8 ในโหมดความเข้ากันได้ของซอร์ส Java 7 ( -source 7พร้อม javac)
  • นักพัฒนาและ CI ของคุณจะต้องรันยูนิตและการทดสอบการรวมกับรันไทม์ Java 8 เพื่อให้ใกล้เคียงกับสภาพแวดล้อมการใช้งานจริงมากที่สุด นักพัฒนาจะต้องเรียกใช้แอปพลิเคชันบนรันไทม์ Java 8 เดียวกันเมื่อเรียกใช้ภายในเครื่อง
  • การคอมไพล์ด้วย JDK 7 และรันด้วย JRE 8 (ในกระบวนการสร้างเดียวกันหรือใน IDE เดียวกัน) ทำได้ยากกว่าการทำทุกอย่างด้วยเวอร์ชันเดียวกัน
  • ไม่มีประโยชน์ในการใช้-source 7แทน-source 8หากคุณคอมไพล์ด้วย JDK 8 และรันไทม์เป้าหมายของคุณคือ Java 8
  • การใช้การ-source 8รับประกันว่าผู้พัฒนาใช้ Java 8 (หรือใหม่กว่า) สำหรับทั้งการคอมไพล์และรันไทม์ (ตามที่บังคับใช้-target 8)

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


สัญลักษณ์แสดงหัวข้อย่อยที่สองไม่ถูกต้อง โพสต์ของคุณขัดแย้งในตัวเองในหลาย ๆ จุด
Marquis of Lorne

@EJP สัญลักษณ์แสดงหัวข้อย่อยที่สองเป็นประสบการณ์ของฉันมากกว่า แต่คุณมีตัวอย่างที่รวบรวมใน JDK 8 ด้วย-source 7แต่ไม่ได้รวบรวมด้วย-source 8หรือไม่? นอกจากนี้โปรดระบุความขัดแย้งเนื่องจากความคิดเห็นของคุณไม่สร้างสรรค์มากนักเช่นนี้…
Didier L
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.