Czy jest jakaś korzyść z uaktualnienia skompilowanego kodu Java 7 do Java 8?

127

Mam starą aplikację napisaną w Javie 7. Działa dobrze w środowisku JRE Java 8. Nie planuję przepisywania żadnego kodu w celu wykorzystania funkcji Java 8. Czy aktualizacja skompilowanego kodu do najnowszej JDK Java 8 ma jakieś techniczne korzyści?

Dla jasności, kod jest obecnie skompilowany w Javie 7 i już działa z najnowszym JRE Java 8. Powinien już skorzystać z ulepszeń środowiska wykonawczego Java 8. To pytanie dotyczy tego, czy kompilacja z wersją 8 i uruchomienie ze skompilowanym kodem bajtowym Java 8 przyniosłoby jakiekolwiek korzyści.


Nie przejmuję się też korzyściami pozatechnicznymi, takimi jak produktywność programistów. Myślę, że to jest ważne, ale nie o to chodzi w tym pytaniu. Proszę ze względu na kod produkcyjny, który NIE ma zespołu programistów. To jest wyłącznie w trybie konserwacji.

g8torPaul
źródło
2
Żeby było jasne. Kod działa już z najnowszym JRE 1.8 i dlatego zawiera wszystkie najnowsze poprawki błędów Java 8 i ulepszenia wydajności środowiska wykonawczego (zgodnie z moją wiedzą).
g8torPaul
4
Jest to prawdopodobnie bardziej pytanie o kod bajtowy wyprowadzany przez kompilator. Może wyjaśnij to nieco w swoim pytaniu.
M Platvoet
2
Więc zwiększona produktywność programistów nie ma tutaj znaczenia?
Mick Mnemonic
7
W jaki sposób „Nie planuję przepisywania żadnego kodu” nie jest jasne, nie mogę uwierzyć.
eldo
3
Może to być trochę powiązane: stackoverflow.com/questions/21732290/ ...
Arnaud

Odpowiedzi:

82

Jeśli dobrze rozumiem pytanie, chcesz wiedzieć, czy kod bajtowy wygenerowany przez javacbędzie „lepszy” w Javie 8 niż w Javie 7.

Odpowiedź prawdopodobnie nie brzmi, stale naprawiają błędy w kompilatorze, co czasami prowadzi do wydajniejszego kodu bajtowego. Ale o ile widzę, nie zobaczysz żadnego znaczącego przyspieszenia z tych poprawek dla Java 8, o ile widzę, dziennik zmian zawiera tylko 2 główne zmiany między wersjami.

Strona oracle jest okropna i nie wydaje mi się, aby uzyskać listę poprawek błędów związanych z javacmiędzy wersjami, ale tutaj nie jest wyczerpująca lista z OpenJDK . Większość z tych, które udało mi się znaleźć, to naprawianie błędów. Tak więc po aktualizacji do Java 8 jest szansa, że ​​nie będzie się już kompilował ze względu na javacbardziej poprawne śledzenie JLS i nie będzie żadnych "ulepszeń" w kodzie bajtowym.

Andrzej
źródło
4
Dzięki, przejrzałem część listy w OpenJDK i nic tam naprawdę nie wyróżnia się poza tym, że wygląda na to, że poprawili wydajność javaca. Zgadzam się, że rozsądne wyszukiwanie poprawek / funkcji pomiędzy wersjami Java na stronie internetowej Oracles jest prawie niemożliwe. Format informacji o wydaniu dla każdej wersji nie jest nawet spójny. Moje przeczucie mówi mi, że nie ma technicznych korzyści z kompilacji z JDK 8 vs JDK 7.
g8torPaul
1
@ g8torPaul, chyba że zamierzasz korzystać z funkcji dostępnych tylko w Javie 8, np. lamdbas / streams
Peter Lawrey
21

Główną korzyścią jest to, że Java 8 ma najnowsze poprawki błędów, ponieważ Java 7 nie jest publicznie aktualizowana.

Również jeśli zamierzasz uruchamiać kod na JVM Java 8, równie dobrze możesz mieć zainstalowaną tylko jedną wersję Javy.

Java 8 może być szybsza i lepiej obsługuje nowe funkcje, takie jak G1. Jednak może to być wolniejsze w twoim przypadku użycia, więc jedynym sposobem na sprawdzenie jest przetestowanie go.

Czy aktualizacja skompilowanego kodu do najnowszej JDK Java 8 ma jakieś techniczne korzyści?

Jeśli pytasz, czy jest jakaś korzyść z ponownej kompilacji kodu Java 7 w kompilatorze Java 8, odpowiedź brzmi; prawie nic.

Jedyną subtelną różnicą jest to, że wystąpiły drobne różnice w interfejsie API języka Java, więc mogą istnieć bardzo subtelne różnice, które kompilator Java 8 może wykryć, że Java 7

Inne drobne różnice to magiczna liczba na początku pliku, prawdopodobnie kolejność stałej puli. Kod bajtowy jest w zasadzie taki sam, nawet wsparcie, dla invokedynamicktórego dodano lambdy, istniało w Javie 7, ale po prostu nie było używane w ten sposób.

Peter Lawrey
źródło
8
Popraw mnie, jeśli się mylę, ale OP pyta o rekompilację kodu za pomocą Java 8, podczas gdy Twoja odpowiedź dotyczy tego, czy użyć Java 8 do jej wykonania?
tobias_k
5
Obecnie pracuję pod najnowszą wersją JRE Java 1.8. Wszystkie poprawki błędów i wewnętrzny kod Java byłyby dostarczane przez środowisko JRE. Nie sądzę, żeby to odpowiadało na moje pytanie.
g8torPaul
16
To po prostu nie odpowiada na pytanie. Jeśli to „prawie nic”, wyjaśnij, jaka jest różnica. W przeciwnym razie to tylko spekulacje
M Platvoet
1
@Peter Lawrey, Mówisz, że „… odpowiedź brzmi; prawie nic”. Czy mamy jakieś dowody na poparcie tego? Przy okazji, zgodziłbym się z tobą.
g8torPaul
2
@ g8torPaul Java 8 została zaprojektowana tak, aby była kompatybilna wstecz z Javą 7 i jeśli nie używasz żadnej z funkcji Java 8, powinna generować prawie dokładnie taki sam kod bajtowy.
Peter Lawrey
21

Może pomóc, tworząc świadomość .

Po przełączeniu się na Java8 możesz zauważyć dodatkowe ostrzeżenia emitowane przez javac. Przykład: wnioskowanie o typie zostało znacznie ulepszone w Javie8. A to może wyeliminować potrzebę stosowania adnotacji @SuppressWarnings w bieżącej bazie kodu (a gdy takie adnotacje nie są już wymagane, kompilator ostrzega o tym).

Tak więc, nawet jeśli nie zamierzasz dziś modyfikować swojej bazy kodu, przejście na Java8 może powiedzieć Ci o takich rzeczach. Poszerzenie wiedzy może pomóc w podejmowaniu świadomych decyzji.

Z drugiej strony:

  • Widziałem tutaj kilka pytań dotyczących (rzadkich) sytuacji, w których Java8 odmówiła kompilacji kodu Java7. Tak więc przejście na Java8 niesie ze sobą (minimalne) ryzyko napotkania tego rodzaju problemu.
  • A: nawet jeśli nie zamierzają dotknąć swoją bazę kodu dzisiaj , istnieje pewna szansa, że później zmienić zdanie na temat. A potem, nie zwracając uwagi, możesz wykorzystać funkcje Java8. Co może skomplikować „aktualizacje terenowe”; ponieważ masz teraz do utrzymania dwie wersje swojego kodu źródłowego!
  • Następnie: w przypadku, gdy masz klientów korzystających z produktu przy użyciu środowiska java7 jre; musisz bardzo uważać na poprawki binarne, które im dajesz. Mamy taką konfigurację; i straciłem czas więcej niż jeden raz, ponieważ przypadkowo umieściłem pojedynczą klasę skompilowaną w Javie8 w systemie testowym opartym na Java7. To po prostu nie może się zdarzyć, gdy twoja konfiguracja deweloperska i testowa / klienta to Java7.

Krótko mówiąc: istnieje kilka subtelnych zalet i pewne ryzyko (gdzie znaczenie ryzyka zależy głównie od ogólnej konfiguracji).

GhostCat
źródło
2
Jeden z przykładów tak rzadkiego problemu „Java8 odmówił kompilacji Java7”: stackoverflow.com/q/41590024/2513200 (znany problem dotyczący kompilatora Oracle dotyczy tylko Javy 8, ale ani 7, ani 9)
Hulk
8

Zrobiłbym przynajmniej dla tych faktów.

1) Wewnętrzne funkcje HashMap (jest szybsze pod jdk-8)

2) Naprawiono wiele błędów, które mogą być dla Ciebie niewidoczne (optymalizacje w czasie wykonywania), które sprawią, że Twój kod będzie szybszy i lepszy bez robienia czegokolwiek.

3) G1 Garbage Collector

EDYTOWAĆ

Z technicznego punktu widzenia brzmi to bardziej jak coś związanego z kompilacją wyprzedzającą czas lub coś, co kompilator może ulepszyć, analizując kod. O ile wiem, takich rzeczy nie robi się w kompilatorze Java 8.

Z punktu widzenia dewelopera - jest ich mnóstwo. Zwiększona produktywność jest dla mnie najważniejsza.

EDYCJA 2

Znam tylko dwa punkty, które pasują do twojego drugiego zapytania:

–Parametry

aby zachować nazwy parametrów metod.

-profil

Opcja zwana kompaktowym profilem zapewniająca mniejszą powierzchnię.

Eugene
źródło
26
Czy jednak samo uruchomienie w Javie 8 nie przyniosłoby już tych korzyści? Wydaje się, że prawdziwe pytanie brzmi: „czy mogę napisać coś w Javie 8, co działa lepiej niż jej odpowiednik w Javie 7”.
Jorn Vernee
8
Obecnie pracuję pod najnowszą wersją JRE Java 1.8. Wszystkie poprawki błędów i wewnętrzny kod Java byłyby dostarczane przez środowisko JRE. Garbage collector jest również częścią środowiska JRE. Nie sądzę, żeby to odpowiadało na moje pytanie.
g8torPaul
8
@JornVernee OPs wyraźnie powiedział, że nie chce niczego przepisywać, więc pytanie, jak rozumiem, brzmi bardziej jak „Czy kompilator Java 8 może zrobić jakieś sztuczki, których kompilator Java 7 nie może zrobić”
tobias_k
2
@JornVernee Pytanie brzmi, czy kod napisany w Javie 7 i skompilowany w Javie 8 działa lepiej niż kod skompilowany w Javie 7
EarlGrey
6
Nie odpowiada na pytanie i jedynie spekuluje, że nie poprawiło się.
M Platvoet
-1

Jeśli nie masz innych powodów, aby ponownie skompilować swoją aplikację, prawdopodobnie nie robi to dużej różnicy, jak stwierdzono w zaakceptowanej odpowiedzi.

Jeśli jednak musisz go przekompilować choćby raz, rozważ to:

  • Twój kod źródłowy aplikacji jest zgodny z Javą 7, a najprawdopodobniej również z 8;
  • W przypadku gdyby kod nie skompilował się z Javą 8, prawdopodobnie nie zostanie skompilowany również z kompilatorem Java 8 w trybie zgodności ze źródłami Java 7 ( -source 7z javac);
  • Twoi programiści i CI będą musieli uruchamiać testy jednostkowe i integracyjne w środowisku wykonawczym Java 8, aby być jak najbliżej środowiska produkcyjnego. Programiści będą również musieli uruchamiać aplikację w tym samym środowisku wykonawczym Java 8 podczas uruchamiania jej lokalnie;
  • Trudniej jest skompilować z JDK 7 i uruchomić ze środowiskiem JRE 8 (w tym samym procesie budowania lub w tym samym IDE) niż robienie wszystkiego z tą samą wersją;
  • Nie ma korzyści z używania -source 7zamiast, -source 8jeśli kompilujesz z JDK 8, a docelowym środowiskiem wykonawczym jest Java 8;
  • Korzystanie z -source 8gwarancji, że programista używa języka Java 8 (lub nowszego) zarówno do kompilacji, jak i do środowiska wykonawczego (wymuszane -target 8).

Podsumowując, nie kompiluj go ponownie, jeśli nie musisz. Jednak za pierwszym razem musisz ponownie skompilować (z powodu zmian w kodzie), przełączyć się na Javę 8. Nie ryzykuj wystąpienia błędu z powodu niezgodności środowiska i nie ograniczaj programistów bez dobrego powodu.

Didier L.
źródło
Drugi punktor jest nieprawidłowy. Twój post w kilku miejscach jest wewnętrznie sprzeczny.
Markiz Lorne
@EJP Drugi punkt jest bardziej z mojego doświadczenia, ale czy masz przykład, który kompiluje się w JDK 8 z, -source 7ale się nie kompiluje -source 8? Czy mógłbyś również wskazać sprzeczności, ponieważ twój komentarz nie jest zbyt konstruktywny jako taki…
Didier L,