Ich habe eine Endlosschleife, in der ein Doublewert alle n Durchläufe mit einer Konstanten multipliziert werden soll. Diese Schleife soll so schnell wie möglich durchgeführt werden. Ich sehe zwei Implementierungsmöglichkeiten: 1. Eine if-Abfrage mit einem Zähler, der bei jedem Durchlauf inkrementiert und bei n zurückgesetzt wird. Bei n wird der Doublewert dann mit der Konstanten multipliziert. 2. Ich passe die Konstante so an, dass ich bei jedem Durchlauf der Endlosschleife den Doublewert mit ihr multiplizieren kann und nach n Durchläufen das gleiche Ergebnis erhalte wie in 1. Hier spare ich eine Abfrage, habe jedoch eine Multiplikation mehr. Welche Option ist schneller?
Maxim schrieb: > Welche Option ist schneller? Allgemein sind int Operationene/Vergleiche schneller in einer VM als double Operationen. Soviel zur Theorie. Praktisch wirst du das messen müssen, deine zweite "Wahl" scheint mir aber irgenwie merkwürdig, eventuell sagst du lieber was du genau vorhast.
Eine innere Schleife, die bis n-1 zählt und eine äußere Endlosschleife, die jeweils vor oder nach Austritt aus der inneren Schleife die Sonderfallbehandlung durchführt. mfG Markus
Welche Option schneller ist, läßt sich nicht beantworten. Das hängt nicht nur von der VM, sondern auch von der Zielmaschine ab. Was sollen solche Optimierungen bezwecken??
Mein Bauchgefühl als Informatiker sagt mir, ich würde eine Zählvariable anlegen, die ich in der schleife dekrementiere
1 | short i = 100; |
2 | while(true) |
3 | { |
4 | if(!i--) |
5 | { |
6 | i = 100; |
7 | //double-berechnung hier |
8 | } |
9 | } |
das wird von JITs in ein
1 | mov ax,100 |
2 | schleife: |
3 | dec ax |
4 | jz @f |
5 | mov ax,100 |
6 | ;double-berechnung |
7 | @@: |
8 | ... |
9 | jmp schleife |
umgesetzt. also recht fix; evtl muss i vorher noch aus dem speicher geholt und wieder wohin geschrieben werden, je nachdem wie viele register du sonst so in deiner schleife benutzt
EDIT: if(!i--) muss natürlich if(!--i) heißen, um mit dem assemblercode übereinzustimmen :D
while(true) { //double-berechnung hier short i = 100; while(!i--) { // nix } } ist schneller, weil der Compiler die sinnlose innere Schleife weglassen kann ;)
Stimmt. Mein Beispiel macht 2 Vergleiche pro Schleifendurchlauf - du machst nur einen. allerdings muss es dann while(i--) heißen :-) und dort wo "nix" steht - also in der inneren Schleife - wird sein sonstiger code ausgeführt
Phantomix schrieb: > allerdings muss es dann while(i--) heißen :-) Bevor ihr eure tollen "Optimierungen" hier postet hättet ihr sie wenigstens dem Compiler einmal vorwerfen können dann wären vermutlich folgende Dinge aufgefallen: 1) Man kann in Java keinen Integer/Short/Long/... negieren 2) Ein Integer/Short/Long/... kann nicht an der Stelle eines boolean stehen. Ansonsten bringt es auch überhauptnix hier einen short zu verwenden, da intern eh mit int gerechnet wird, und außerdem wäre wenn der korrekte Datentyp mit 8bit byte (bringt aber auch bestenfalls eine Speicherersparnis). Zwar nicht so mystisch, dafür aber korrekt könnte es z.B. dann so aussehen
1 | while (true) { |
2 | //double-Berechnung hier
|
3 | for (int i = 0; i < 100; i++) { |
4 | //sonstiges
|
5 | }
|
6 | }
|
dafür muß man dann auch nicht auf sein Bauchgefühl vertrauen und der nächste versteht sofort was gemeint ist...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.