Forum: PC-Programmierung Java: Operation nur alle n Durchläufe ausführen


von Maxim (Gast)


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?

von codehamster (Gast)


Lesenswert?

modulo?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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.

von Markus J. (markusj)


Lesenswert?

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

von Stefan M. (Gast)


Lesenswert?

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

von Phantomix (Gast)


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

von Phantomix (Gast)


Lesenswert?

EDIT:

if(!i--)

muss natürlich

if(!--i)

heißen, um mit dem assemblercode übereinzustimmen :D

von Hans M. (hansilein)


Lesenswert?

while(true)
{
  //double-berechnung hier
short i = 100;
  while(!i--)
  {
// nix
}
}


ist schneller, weil der Compiler die sinnlose innere Schleife weglassen 
kann ;)

von Phantomix (Gast)


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

von Läubi .. (laeubi) Benutzerseite


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

von Hans M. (hansilein)


Lesenswert?

Danke fürs "portieren" der "Optimierungen" :)

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
Noch kein Account? Hier anmelden.