Java: Operation nur alle n Durchläufe ausführen

Gast #2194186
Lesenswert?

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?
Gast #2194550
Lesenswert?

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
Gast #2196041
Lesenswert?

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
Persönliche Seite #2196083
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren