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

Gast #2194186
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
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??
Gast
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
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
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

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.