W c++ warunek:
If (a>b) func1()
else func2()
można zapisać:
a>b ? func1() : func2()
czy w java coś takiego istnieje?
W c++ warunek:
If (a>b) func1()
else func2()
można zapisać:
a>b ? func1() : func2()
czy w java coś takiego istnieje?
Tak.
rozumiem że wygląda to identycznie?
A jest jakaś różnica w szybkości działania programu?
ne0 napisał(a)
A jest jakaś różnica w szybkości działania programu
?
Taka, że powinieneś ją całkowicie zignorować. Jeśli będziesz miał problemy z wydajnością, jeśli w procesie profilowania aplikacji wyjdzie Ci, że taka instrukcja warunkowa znajduje się w samym sercu najgorszego wąskiego gardła w systemie, to... pewnie nawet wtedy optymalizacja nie zrobi różnicy, ale możesz się nad tym zastanowić.
W innych przypadkach -- nie ma tak łatwo. Optymalizacja szybkości programu to nie jest rzecz typu "zawsze używaj ?: gdy tylko możesz". Gdyby to było takie proste, to i tak kompilator kodu bajtowego sam by wprowadzał takie optymalizacje.
Przejmowanie się takimi pseudo-optymalizacjami jak użycie operatora czy ifa świadczyć może jedynie o tym, że ktoś nie ma jeszcze zbyt wielkiego doświadczenia w prawdziwym optymalizowaniu aplikacji. Nie zrozum mnie źle: wydajność jest ważna, ale nie uzyskuje się jej dokonując wyboru spośród pary instrukcji/wyrażeń ;). I nie, to nie jest "zawsze coś", bo 0.0001% zysku w wydajności to jest NIC -- znacznie więcej zależy od tego, co będzie sobie robił np. garbage collector.
A jeśli bardzo trapi Cię kwestia wydajności, to sobie sprawdź. Napisz programik, który porówna dwie rzeczy (tylko wykonaj odpowiednią liczbę iteracji, no i samych testów) -- tak dla praktyki -- i wstaw tu wyniki.
Poza tym -- nie przejmuj się takimi pierdołami i używaj tego, co wydaje Ci się czytelniejsze. Czytelność ma o wiele większe znaczenie niż ewentualny zysk z wydajności (który naprawdę może być niemierzalny!). Czytelność ma duży wpływ na szybkość dostarczenia aplikacji, a nawet na liczbę błędów. Wydajniejsza praca z kodem to również więcej czasu na prawdziwe optymalizacje.
Dla dwóch kodów źródłowych:
Klasa1.java:
public class Klasa1 {
public static void main(String[] args) {
String wynik; if (args.length > 0) wynik = "A"; else wynik = "B";
}
}
Klasa2.java:
public class Klasa2 {
public static void main(String[] args) {
String wynik = (args.length > 0) ? "A" : "B";
}
}
Wyniki dekompilacji są takie:
piotrek@piotrek-PC:~/Pulpit$ javac Klasa1.java
piotrek@piotrek-PC:~/Pulpit$ javac Klasa2.java
piotrek@piotrek-PC:~/Pulpit$ javap -c Klasa1
Compiled from "Klasa1.java"
public class Klasa1 extends java.lang.Object{
public Klasa1();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: aload_0
1: arraylength
2: ifle 11
5: ldc #2; //String A
7: astore_1
8: goto 14
11: ldc #3; //String B
13: astore_1
14: return
}
piotrek@piotrek-PC:~/Pulpit$ javap -c Klasa2
Compiled from "Klasa2.java"
public class Klasa2 extends java.lang.Object{
public Klasa2();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: aload_0
1: arraylength
2: ifle 10
5: ldc #2; //String A
7: goto 12
10: ldc #3; //String B
12: astore_1
13: return
}
piotrek@piotrek-PC:~/Pulpit$
A więc kod z ifem produkuje o jedną instrukcję przypisania dłuższy kod bajtowy. W sumie logiczne, bo w tym kodzie są dwa przypisania, a nie jedno.
Różnica w wydajności, o ile w ogóle jakaś, zależna jest od:
Inaczej mówiąc:
O ile nie kompilujesz bajtkodu Javowego do EXEka, np za pomocą GCJ czy Excelsior JET, to te twoje bardzo niskopoziomowe optymalizacje, mogą w rzeczywistości pogorszyć sprawę, bo nie wiesz czym ktoś będzie bajtkod kompilował.
chciałbym stać się specem od optymalizacji. Jaka jest do tego najlepsza droga?
Jedyna sensowna droga to nauka algorytmów i rozwijanie umiejętności algorytmicznych. Największe możliwości optymalizacji daje poprawienie algorytmu. Na kombinowaniu różnymi konstrukcjami języka wiele nie zyskasz.
Dokładnie. Pierwsza książka do ręki to "Wprowadzenie do algorytmów" Cormena. Potem możesz np poczytać: http://agner.org/optimize/ czy coś podobnego.
Zależy też jakim specem chcesz być. Czy chcesz: