Java ist ne verrückte Sprache....
Geizhals » Forum » Programmierung » Java ist ne verrückte Sprache.... (47 Beiträge, 575 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 Übersicht Chronologisch
 
Melden nicht möglich
........
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 Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
..........
Re(10): Java ist ne verrückte Sprache....
13.11.2006, 15:29:45

Warum ist es immer mit euch Leuten aus der C/C++ Welt, dass ihr manche Gegebenheiten nicht einfach als gegeben hinnehmen könnt und krampfhaft immer versuchen müsst, das, was ihr halt von eurer "alten" Umgebung kennt, auf Biegen und Brechen auch sonst überall unterzubringen?

Nun ja... Liebgewonnenes wie Compilerswitches möchte man natürlich woanders nicht missen... Insbesondere wenn es - wahrscheinlich -  nicht schwer zu implementieren wäre.


... der großteil der Laufzeit in deinem eigenen schnell hingeschluderten Sch.eißcode verbraten wird

Das ist nun mal kein Java-Phänomen sondern gilt wohl generell...
Wobei Dich Designpatterns und "bekannte Algorithmen" darin unterstützen, sauberen Code zu schreiben... Insbesondere unter Java finde zB die Collections eine gute Idee, einem Coder ohne Aufwand verschiedene mächtige Storagegschichterln (Hashmap, Hashset, ..) zur Verfügung zu stellen, die sich -leider- einige C-Coder nicht antaten.

Warum fühlen sich eigentlich Javianer angegriffen, wenn man manche Konzepte von Java für nicht super findet ? Es gibt wohl keine perfekte Sprache, die alle denkbaren Vorteile in sich vereinigt (Algol, Haskell und Perl mal ausgenommen ;-) ).
Definitiv ist es eine Frage der Aufgabenstellung, definitiv ist Java eine eigene Welt, bei der sehr vieles anders gelöst wird als in der "guten Standard-EDV", wogegen mal per se nichts einzuwenden ist. Tatsächlich modifiziert sich aber Java - gottseidank - und ist nicht bei 1.0 stehengeblieben... Und das eben genau weil viele (wohl größtenteils Java-Entwickler, da sie sonst kein Gehör gefunden hätten) Gegebenheiten nicht einfach als gegeben hinnehmen konnten ;-).

Jedenfalls war mein Initialposting kein Angriff auf die Sprache - sondern ein (eventuell provokant gebrachtes) Auseinandersetzen von mir mit für mich unüblichen Vorgehensweisen in der JavaWelt. Tatsächlich half zB adhoc ja auch beim lösen des switch()-Statements... Seine Erklärung dürfte es wohl sein.

Dein  Argument "Der Algo entscheidet" gilt natürlich grundsätzlich - aber auch wenn du einen sauberen, performanten Algo gefunden hast, gilt es - öfters - den Lowlevel zu optimieren.... Einerseits wegen KVM, andererseits schlicht wegen der Useranzahl bei Enterprise-Apps... Wenn eine Optimierung nur 1ms Geschwindigkeit pro Zugriff erspart - und 1000 User parallel zugreifen - fällt das ganz schnell wieder ins Gewicht ...

Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
............
Re(12): Java ist ne verrückte Sprache....
13.11.2006, 16:52:36

gleichzeitig bist du aber auch einer der ewigen gestrigen (nicht falsch verstehen) der nicht akzeptieren kann, dass nicht alles, was früher gut und unabdingbar war auch heute noch 1:1 gelten muss

Touche - Da triffst einen wunden Punkt... Früher dachte ich ähnlich über Saurier ;-)
Gleichzeitig war es aber so, daß mein Code/meine Projekte früher sicherlich schlechter waren als heute, sei es in Bezug auf Wartbarkeit, Erweiterbarkeit, ... Ich bin also echt überzeugt, daß meine Qualifikation durch die Jahre gestiegen ist (Garantie gibt's keine), merke aber auch selbst, daß ich mich auf den Saurierstatus hinentwickel ;-)

Tatsächlich - so meine Vermutung/Rechtfertigung vor mir selber - bleiben /in einigen Fällen/ genau dieselben Probleme bestehen... Beispiel:

Meine Fixe Überzeugung war früher, daß du keine Chance hast, guten Code zu schreiben, wenn du dich nicht durch Knuth's "Art of Computer Programming" durchgeackert hast... Insbesondere Teil 2 und 3 fand ich entscheidend und blätterte oft nach (ja, mein Hirn ist ein Sieb ,-) ).

Ich gebe gerne zu, daß das heute nicht mehr zwingend notwendig ist, daß das Verständnis seiner - obwohl uralten - Algorithmen heute noch eine sehr starke Unterstützung darstellt...

Wo ich hinwill:
Wirklich vieles wird obsolet - klar.
Keinesfalls wird aber alles obsolet.

Und... Es gibt ja sicherlich gute Gründe, warum man auf einiges verzichtet hat... Man muß die Meinung deswegen ja nicht teilen, aber es hilft i.d.R. immer fundamental, wenn man die Gedankengänge einiger Überlegungen nachvollziehen kann... Und genau darum geht's mir: echt.

Ist genauso wie im Job: Wenn du eine Shice-Hackn bekommst, deren Sinn du nicht verstehst (weil er Dir zB nicht mitgeteilt wird und es so mal krass idiotisch klingt), dann gehst ganz anders an die Sache ran, als wenn du dieselbe Hackn bekommst und Dir erklärt wird, warum das jetzt leider genau so gelöst werden muß.

Abschließend:
Natürlich hast du recht, daß Lowlevel-Optimieren immer der allerallerletzte Optimierungsschritt sein muß, und vorher wirklich massiv anderes passieren muß... Trotz allem gibt's manchmal den Bedarf, auch wirklich in die letzte Ebene runterzugehen... Und da wird man halt gerne unterstützt. Bei mir halt persönlich wegen Handy-Gschichtln...


13.11.2006, 16:54 Uhr - Editiert von Linux_Sucks, alte Version: hier
Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
 

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