Có bất kỳ lợi ích nào khi nâng cấp mã biên dịch Java 7 lên Java 8 không?


127

Tôi có một ứng dụng cũ được viết bằng Java 7. Nó chạy tốt trong JRE Java 8. Tôi không có kế hoạch viết lại bất kỳ mã nào để sử dụng các tính năng Java 8. Có bất kỳ lợi ích kỹ thuật nào để nâng cấp mã được biên dịch lên JDK Java 8 mới nhất không?

Để rõ ràng, mã hiện được biên dịch bằng Java 7 và đã chạy với JRE Java 8 mới nhất. Nó đã được hưởng lợi từ các cải tiến thời gian chạy Java 8. Câu hỏi này là liệu có bất kỳ lợi ích nào sẽ đạt được bằng cách biên dịch với phiên bản 8 và chạy với mã byte được biên dịch Java 8 hay không.


Ngoài ra, tôi không quan tâm đến lợi ích phi kỹ thuật như năng suất của nhà phát triển. Tôi nghĩ đó là những điều quan trọng nhưng không phải là điểm của câu hỏi này. Tôi đang yêu cầu lợi ích của mã sản xuất KHÔNG có đội ngũ phát triển. Nó hoàn toàn trong chế độ bảo trì.


2
Chỉ để được rõ ràng. Mã đã chạy với 1.8 JRE mới nhất và do đó có tất cả các bản sửa lỗi Java 8 mới nhất và cải thiện hiệu năng thời gian chạy (theo hiểu biết của tôi).
g8torPaul

4
Đây là một câu hỏi có lẽ nhiều hơn về mã byte được trình biên dịch xuất ra. Có thể làm cho điều đó rõ ràng hơn một chút trong câu hỏi của bạn.
M Platvoet

2
Vì vậy, năng suất nhà phát triển được cải thiện không liên quan ở đây?
Mick Mnemonic

7
Làm thế nào "Tôi không có kế hoạch viết lại bất kỳ mã nào" không rõ ràng tôi không thể tin được.
eldo

3
Điều này có thể hơi liên quan: stackoverflow.com/questions/21732290/ từ
Arnaud

Câu trả lời:


82

Nếu tôi hiểu chính xác câu hỏi, bạn muốn biết nếu mã byte được tạo bởi javacsẽ "tốt hơn" trong Java 8 so với Java 7.

Câu trả lời có lẽ là không, họ liên tục sửa các lỗi trong trình biên dịch và điều đó đôi khi dẫn đến mã byte hiệu quả hơn. Nhưng bạn sẽ không thấy bất kỳ sự tăng tốc đáng kể nào từ các bản sửa lỗi này cho Java 8 như tôi có thể thấy, thay đổi chỉ liệt kê 2 thay đổi lớn giữa các phiên bản.

Trang web oracle rất tệ và dường như tôi không thể có được một danh sách các lỗi liên quan đến javacgiữa các phiên bản, nhưng đây là một bản không đầy đủ từ OpenJDK . Phần lớn những cái tôi có thể quản lý để tìm là sửa lỗi. Vì vậy, bằng cách cập nhật lên Java 8, có khả năng nó sẽ không biên dịch thêm nữa do javactuân theo JLS chính xác hơn và sẽ có rất ít "không có" cải tiến cho mã byte.


4
Cảm ơn, tôi đã xem xét một số danh sách trên OpenJDK và không có gì thực sự nổi bật ở đó ngoại trừ việc có vẻ như họ đã cải thiện hiệu suất của javac. Tôi đồng ý rằng việc tìm kiếm các sửa lỗi / tính năng hợp lý giữa phiên bản Java trên trang web Oracles là điều không thể. Định dạng của ghi chú phát hành cho mỗi phiên bản thậm chí không nhất quán. Ruột của tôi nói với tôi rằng không có lợi ích kỹ thuật nào khi biên dịch với JDK 8 so với JDK 7.
g8torPaul

1
@ g8torPaul trừ khi bạn sẽ sử dụng các tính năng chỉ có sẵn trong Java 8, ví dụ: lamdbas / stream
Peter Lawrey

21

Lợi ích chính là Java 8 có các bản sửa lỗi mới nhất trong đó Java 7 không được cập nhật công khai.

Ngoài ra, nếu bạn định chạy mã trên JVM Java 8, bạn cũng có thể chỉ có một phiên bản Java được cài đặt.

Java 8 có thể nhanh hơn và nó hỗ trợ tốt hơn cho các tính năng mới như G1. Tuy nhiên, trường hợp sử dụng của bạn có thể chậm hơn nên cách duy nhất để biết là kiểm tra nó.

Có bất kỳ lợi ích kỹ thuật nào để nâng cấp mã được biên dịch lên JDK Java 8 mới nhất không?

Nếu bạn đang hỏi liệu có bất kỳ lợi ích nào trong việc biên dịch lại mã Java 7 trong trình biên dịch Java 8 hay không, câu trả lời là; hầu như không có gì.

Sự khác biệt tinh tế duy nhất là đã có những khác biệt nhỏ đối với API Java, do đó, có thể có những khác biệt rất tinh vi mà trình biên dịch Java 8 có thể thấy rằng Java 7

Sự khác biệt nhỏ khác là số ma thuật ở đầu tập tin, có thể là thứ tự của nhóm không đổi. Mã byte về cơ bản là giống nhau, thậm chí hỗ trợ invokedynamicđược thêm cho lambdas tồn tại trong Java 7 nhưng không được sử dụng theo cách đó.


8
Sửa lỗi cho tôi nếu tôi sai, nhưng OP hỏi về việc biên dịch lại mã với Java 8, trong khi câu trả lời của bạn là về việc có nên sử dụng Java 8 để thực thi nó không?
tobias_k

5
Tôi hiện đang chạy theo JRE Java 1.8 mới nhất. Tất cả các bản sửa lỗi và mã Java nội bộ sẽ được JRE cung cấp. Tôi không nghĩ rằng điều này giải quyết câu hỏi của tôi.
g8torPaul

16
Điều này chỉ đơn giản là không trả lời câu hỏi. Nếu đó là "hầu như không có gì", vui lòng làm rõ sự khác biệt là gì. Mặt khác, nó chỉ là suy đoán
M Platvoet

1
@Peter Lawrey, Bạn nói rằng ".. câu trả lời là; hầu như không có gì". Chúng ta có bằng chứng nào chứng minh điều đó không? BTW, tôi có xu hướng đồng ý với bạn.
g8torPaul

2
@ g8torPaul Java 8 được thiết kế để tương thích ngược với Java 7 và nếu bạn không sử dụng bất kỳ tính năng nào của Java 8, thì nó sẽ tạo ra gần như chính xác mã byte.
Peter Lawrey

21

Nó có thể giúp bằng cách tạo ra nhận thức .

Khi bạn chuyển sang Java8, bạn có thể thấy các cảnh báo bổ sung được phát ra bởi javac. Ví dụ: suy luận kiểu đã được cải thiện rất nhiều với Java8. Và điều đó có thể loại bỏ sự cần thiết của các chú thích @SuppressWarnings trong cơ sở mã hiện tại của bạn (và khi các chú thích đó không còn cần thiết nữa, trình biên dịch sẽ cảnh báo về điều đó).

Vì vậy, ngay cả khi bạn không có ý định sửa đổi cơ sở mã của mình ngày hôm nay, việc chuyển sang Java8 có thể cho bạn biết về những điều như vậy. Tăng kiến ​​thức của bạn có thể giúp đưa ra quyết định sáng suốt.

Mặt khác:

  • Tôi đã thấy một số câu hỏi ở đây về các tình huống (hiếm) trong đó Java8 từ chối biên dịch mã Java7. Vì vậy, việc chuyển sang Java8 cũng mang đến rủi ro (tối thiểu) khi gặp phải loại vấn đề đó.
  • Và: ngay cả khi bạn không có ý định chạm vào cơ sở mã của mình ngày hôm nay , có một cơ hội nhất định mà bạn sẽ thay đổi quyết định sau này. Và sau đó, khi không chú ý, bạn có thể khai thác các tính năng Java8. Điều này có thể làm phức tạp "cập nhật trường"; như bây giờ bạn có hai phiên bản mã nguồn của mình để duy trì!
  • Sau đó: trong trường hợp bạn có khách hàng chạy sản phẩm bằng java7 jre; bạn phải thực sự cẩn thận về các bản sửa lỗi nhị phân mà bạn cung cấp cho họ. Chúng tôi có một thiết lập như vậy; và tôi đã lãng phí thời gian hơn một lần vì tôi vô tình đưa một lớp được biên dịch Java8 lên một hệ thống thử nghiệm do Java7 điều khiển. Điều đó chỉ đơn giản là không thể xảy ra khi thiết lập dev và test / khách hàng của bạn là tất cả Java7.

Câu chuyện dài: có một vài lợi thế tinh tế và một số rủi ro nhất định (trong đó tầm quan trọng của các rủi ro chủ yếu phụ thuộc vào thiết lập tổng thể của bạn).


2
Một ví dụ về một vấn đề "Java8 hiếm khi từ chối biên dịch Java7": stackoverflow.com/q/41590024/2513200 (một vấn đề đã biết của Trình biên dịch Oracle chỉ ảnh hưởng đến Java 8, nhưng không phải là 7 hoặc 9)
Hulk

8

Tôi sẽ làm cho ít nhất những sự thật này.

1) Nội bộ HashMap (nhanh hơn theo jdk-8)

2) Rất nhiều lỗi đã được sửa thể trong suốt đối với bạn (tối ưu hóa thời gian chạy) sẽ giúp mã của bạn nhanh hơn và tốt hơn mà không cần bạn thực sự làm gì.

3) Thu gom rác G1

BIÊN TẬP

Từ quan điểm kỹ thuật, điều này nghe có vẻ giống với điều gì đó với Ahead of Time Compilation hoặc thứ gì đó mà trình biên dịch có thể cải thiện bằng cách phân tích mã nhiều hơn. Theo tôi biết những điều như vậy không được thực hiện trong trình biên dịch java 8.

Từ quan điểm của nhà phát triển - có rất nhiều. Tăng năng suất là điều quan trọng nhất đối với tôi.

CHỈNH SỬA 2

Tôi chỉ biết hai điểm phù hợp với truy vấn thứ hai của bạn:

-thông số

để bảo toàn tên tham số của phương thức.

-Hồ sơ

Được gọi là Tùy chọn cấu hình nhỏ gọn cho dấu chân nhỏ hơn.


26
Mặc dù vậy, không chỉ chạy trong Java 8 đã mang lại những lợi ích này? Câu hỏi thực sự có vẻ là, "tôi có thể viết một cái gì đó trong Java 8 hoạt động tốt hơn so với tương đương Java 7 không".
Jorn Vernee

8
Tôi hiện đang chạy theo JRE Java 1.8 mới nhất. Tất cả các bản sửa lỗi và mã Java nội bộ sẽ được JRE cung cấp. Trình thu gom rác cũng là một phần của JRE. Tôi không nghĩ rằng điều này giải quyết câu hỏi của tôi.
g8torPaul

8
@JornVernee Ops dứt khoát nói rằng ông không muốn viết lại bất cứ điều gì, vì vậy câu hỏi, như tôi hiểu nó, là giống như "có thể trình biên dịch Java 8 làm bất kỳ thủ thuật trình biên dịch Java 7 có thể không làm"
tobias_k

2
@JornVernee Câu hỏi là, nếu mã được viết bằng Java 7 và được biên dịch trong Java 8 thực thi tốt hơn thì mã được biên dịch trong Java 7
EarlGrey

6
Không trả lời câu hỏi và chỉ suy đoán nó không được cải thiện.
M Platvoet

-1

Nếu bạn không có lý do nào khác để biên dịch lại ứng dụng của mình, thì có lẽ nó không tạo ra nhiều khác biệt, như đã nêu trong câu trả lời được chấp nhận.

Tuy nhiên, nếu bạn phải biên dịch lại dù chỉ một lần, hãy xem xét điều này:

  • Mã nguồn ứng dụng của bạn tương thích với Java 7 và rất có thể là 8;
  • Trong trường hợp mã không biên dịch được với Java 8, có lẽ nó sẽ không biên dịch với trình biên dịch Java 8 trong chế độ tương thích nguồn Java 7 ( -source 7với javac);
  • Các nhà phát triển và CI của bạn sẽ cần chạy các thử nghiệm đơn vị và tích hợp đối với thời gian chạy Java 8 để càng gần với môi trường sản xuất. Các nhà phát triển cũng sẽ cần chạy ứng dụng trên cùng thời gian chạy Java 8 khi chạy nó cục bộ;
  • Việc biên dịch với JDK 7 sẽ khó khăn hơn và chạy với JRE 8 (trong cùng quá trình xây dựng hoặc trong cùng một IDE) so với làm mọi thứ với cùng một phiên bản;
  • Không có lợi ích gì khi sử dụng -source 7thay vì -source 8nếu bạn biên dịch với JDK 8 và thời gian chạy đích của bạn là Java 8;
  • Việc sử dụng -source 8đảm bảo rằng nhà phát triển đang sử dụng Java 8 (hoặc mới hơn) cho cả biên dịch và thời gian chạy (khi nó thi hành -target 8).

Tóm lại, đừng biên dịch lại nếu bạn không cần. Tuy nhiên, trong lần đầu tiên bạn phải biên dịch lại (do thay đổi mã), hãy chuyển sang Java 8. Đừng có nguy cơ gặp lỗi do sự không phù hợp với môi trường và không hạn chế các nhà phát triển mà không có lý do chính đáng.


Điểm đạn thứ hai không đúng. Bài viết của bạn là tự mâu thuẫn ở một số điểm.
Hầu tước Lorne

@EJP Điểm đạn thứ hai là kinh nghiệm của tôi nhiều hơn, nhưng bạn có một ví dụ nào biên dịch trong JDK 8 với -source 7nhưng không biên dịch với -source 8? Ngoài ra, bạn có thể vui lòng cho biết những mâu thuẫn vì nhận xét của bạn không mang tính xây dựng như vậy
Didier L
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.