Czy w J. istnieje "a>b? do A : Do B" ?

0

W c++ warunek:
If (a>b) func1()
else func2()
można zapisać:
a>b ? func1() : func2()

czy w java coś takiego istnieje?

0

Tak.

0

rozumiem że wygląda to identycznie?
A jest jakaś różnica w szybkości działania programu?

0
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.

0

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:

  • rodzaju maszyny wirtualnej, np: Sun Hotspot, OpenJDK, IBM J9, Oracle JRockit, itd
  • wersji maszyny wirtualnej, np: Java 6 Update 1, Java 6 Update 24,
  • architektury procesora,
  • wersji binarki,
  • systemu operacyjnego,
  • otaczającego kodu,
  • scenariusza wywołań funkcji,

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ł.

0

chciałbym stać się specem od optymalizacji. Jaka jest do tego najlepsza droga?

0

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.

0

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:

  • optymalizować kod źródłowy - wtedy musisz znać dobrze algorytmy i struktury danych,
  • optymalizować kod wynikowy, np jako autor kompilatora - wtedy musisz znać też budowę procesorów na które optymalizujesz. Uwaga: pisząc kompilator musisz znać też dobrze to co powyżej, czyli algorytmy i struktury danych, jako że aby napisać dobry kompilator to trzeba się posłużyć wieloma nietrywialnymi konstrukcjami,

1 użytkowników online, w tym zalogowanych: 0, gości: 1