Re(8): Java ist ne verrückte Sprache....
Geizhals » Forum » Programmierung » Java ist ne verrückte Sprache.... (47 Beiträge, 580 Mal gelesen) Top-100 | Fresh-100
Du bist nicht angemeldet. [ Login/Registrieren ]
Java ist ne verrückte Sprache....
05.11.2006, 22:52:30
Ausgehend von der Idee, daß Java ja eine kompilierte Sprache ist, macht der Compiler in P-Code recht wenig...

Ich bin mal über http://www.microjava.com/articles/techtalk/optimization?PageNo=4  gestolpert - Optimierungstechniken für J2ME (bzw. Java generell).

Was ich wirklich krass finde:
1.) Loop unrolling... Muß der Coder selbst machen, der Compiler kriegt das net hin ???
2.) >> ist schneller als ne Division ? Warum um Himmels willen... Ich meine, klar auf Assemblerebene und von mir aus auf P-Code-Ebene... Nur jeder normale C-Compiler wandelt sowas um, warum net javac ?
3.) Das IMHO allerkrasseste:

  public static final int STATE_RUNNING = 1000;
  public static final int STATE_JUMPING = 2000;
  public static final int STATE_SHOOTING = 3000;
  switch ( n ) {
    case STATE_RUNNING:
      doRun();
    case STATE_JUMPING:
      doJump();
    case STATE_SHOOTING:
      doShoot();
  }

There's nothing wrong with this, and the int constants are nice and far apart, in case we might want to stick another constant in between RUNNING and JUMPING, like STATE_DUCKING = 2500. But apparently switch statements can be compiled into one of two byte codes, and the faster of the two is used if the ints used are close together, so this would be better:

  public static final int STATE_RUNNING = 1;
  public static final int STATE_JUMPING = 2;
  public static final int STATE_SHOOTING = 3;


Was ist denn das für eine schräge Sprache ? Ich mein,alles sind ints, und switch()-Statements sind unterschiedlich schnell, je nachdem ob die Werte näher sind ???

Man muß sich direkt mal Java-PCode-Assembler ansehen, der muß ja krank sein ;-)

Antworten PM Alle Chronologisch
 
Melden nicht möglich
.  Re: Java ist ne verrückte Sprache....  (Wizard51 am 05.11.2006, 22:59:03)
.. Vom Autor zurückgezogen oder Autor hat seine Registrierung nicht bestätigt  (leave_my_name_out am 06.11.2006, 11:19:18)
.  Re: Java ist ne verrückte Sprache....  (nergal am 06.11.2006, 06:31:48)
...  Re(3): Java ist ne verrückte Sprache....  (nergal am 06.11.2006, 08:40:21)
. Vom Autor zurückgezogen oder Autor hat seine Registrierung nicht bestätigt  (Nagelfar am 06.11.2006, 09:53:01)
... Vom Autor zurückgezogen oder Autor hat seine Registrierung nicht bestätigt  (Nagelfar am 06.11.2006, 10:52:18)
..... Vom Autor zurückgezogen oder Autor hat seine Registrierung nicht bestätigt  (Nagelfar am 06.11.2006, 11:05:41)
....... Vom Autor zurückgezogen oder Autor hat seine Registrierung nicht bestätigt  (Nagelfar am 06.11.2006, 11:18:29)
........
Re(8): Java ist ne verrückte Sprache....
06.11.2006, 11:27:31

Optimierung setzt ja jetzt nicht nur rein auf Prozessorebene an, da gehts auch um Threadhandling, Garbage Collection, Fileaccess, Datentypen usw...

Sowas war eh klar...

Nur passieren da 2 Paar Schuhe - zumindest IMHO, aber ich arbeite mich ja erst ein in Java, drum die DAU-Fragen:
Einerseits die Optimierungen, die stattfinden um den ByteCode zu erzeugen
Andererseits die Optimierungen, die in der VM stattfinden (also JIT, ...).

Grundsätzlich gab es (mit einer Ausnahme) immer die Philosophie, daß der Compiler Zeit hat - und der alle Optimierungen für das Zielsystem machen soll. Am Zielsystem soll das Proggy dann so schnell wie möglich laufen. Da Optimierungen Zeit kosten -> Compiler soll sie machen. Das Zielsystem unterstützt nur mit Branch Prediction, L1-Caches, ... Natürlich umso besser, je mehr der Compiler darauf geachtet hat (zB loop-Code in eine Cacheline).

Die Einzige Ausnahme, mit der ich mich vorher mal befaßte, war EPIC... Da konnte der Compiler einiges nicht sinnvoll optimieren beim setzen seiner Tags.

Bei Java bin ich nun davon ausgegangen, daß zumindest immer derselbe Weg der schneller sein wird.
Beispiel:
In dem Link wurde gebracht, daß ein

for (f = 0 ; f < 10 ; f++) { machWas(); }
langsamer sei als
machWas();machWas();machWas();machWas();machWas();machWas();machWas();machWas();machWas();machWas();

Abgesehen davon, daß ich das echt pervers finde (trickse ich mit sowas den eventuell vorhandenen  JIT aus ???? Oder auch ohne JIT: Wieso ist 10x interpretieren schneller als die Loop?) - so rennen doch J2MEs auf unterschiedlichen Prozessoren, handy-Ossen, ... Scheinbar ist aber manuelles Loop-Unrolling immer schneller... So behauptet zumindest der Link. Nun denn, dann soll es aber der Compiler machen ;-)

Antworten PM Alle Chronologisch Zum Vorgänger
 
Melden nicht möglich
.........  Re(9): Java ist ne verrückte Sprache....  (mko am 06.11.2006, 11:31:18)
......... Vom Autor zurückgezogen oder Autor hat seine Registrierung nicht bestätigt  (Nagelfar am 06.11.2006, 11:35:11)
........... Vom Autor zurückgezogen oder Autor hat seine Registrierung nicht bestätigt  (Nagelfar am 06.11.2006, 12:11:00)
............. Vom Autor zurückgezogen oder Autor hat seine Registrierung nicht bestätigt  (Nagelfar am 06.11.2006, 12:33:23)
.  Re: Java ist ne verrückte Sprache....  (adhoc am 12.11.2006, 20:25:02)
...  Re(3): Java ist ne verrückte Sprache....  (adhoc am 12.11.2006, 20:37:26)
...  Re(3): Java ist ne verrückte Sprache....  (adhoc am 12.11.2006, 21:30:13)
.....  Re(5): Java ist ne verrückte Sprache....  (adhoc am 13.11.2006, 10:01:31)
.......  Re(7): Java ist ne verrückte Sprache....  (adhoc am 13.11.2006, 12:15:50)
......... Vom Autor zurückgezogen oder Autor hat seine Registrierung nicht bestätigt  (Nagelfar am 13.11.2006, 14:39:05)
........... Vom Autor zurückgezogen oder Autor hat seine Registrierung nicht bestätigt  (Nagelfar am 13.11.2006, 15:42:00)
............. Vom Autor zurückgezogen oder Autor hat seine Registrierung nicht bestätigt  (Nagelfar am 14.11.2006, 11:34:36)
 

Dieses Forum ist eine frei zugängliche Diskussionsplattform.
Der Betreiber übernimmt keine Verantwortung für den Inhalt der Beiträge und behält sich das Recht vor, Beiträge mit rechtswidrigem oder anstößigem Inhalt zu löschen.
Datenschutzerklärung