Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Schnellere Ganzzahl-Division gesucht - Alternative zu DIV?
Dargor - Fr 12.08.05 12:35
Titel: Schnellere Ganzzahl-Division gesucht - Alternative zu DIV?
In meinem Player lese ich über einen VU-Meter den aktuellen Pegel aus und lasse in Abhängigkeit des Pegels Ellipsen auf ein DXDraw (DelphiX) zeichnen. Um die Koordinaten der Ellipsen zu bestimmen, benutze ich die Formeln:
Delphi-Quelltext
1: 2: 3: 4:
| x1 := (Screen.Height div 2) - ((VuMeter1.ValueRight * (Screen.Height div 2)) div 32768); y1 := (Screen.Width div 2) - ((VuMeter1.ValueRight * (Screen.Width div 2)) div 32768); x2 := Screen.Height - x1; y2 := Screen.Width - y1; |
Da ich insgesamt 4 Ellipsen zeichne (2 für den Pegel links, rechts & 2 für den Peak links, rechts), habe ich 16 Formeln und das geht ziemlich auf die CPU.
Die ganze Prozedur läuft in einem Extra-Thread und hat einen Sleep von 100 msek.
Trotzdem habe ich rund 10-25% CPU-Last auf meinem P4 2,53GHz. Bei einem Sleep von 200 msek sinkt die CPU-Last nicht mal um 5%. Wenn ich die Ellipsen nicht zeichnen lasse, habe ich max. 1-2% CPU-Last - es liegt also nicht am Programm selbst.
Ich nehme mal an, dass die große Menge an Ganzzahl-Divisionen ausschlaggebend dafür ist. Gibt es eine schnellere Alternative? Oder kann man die Formeln optimieren?
Moderiert von
raziel: Code- durch Delphi-Tags ersetzt.
chrisw - Fr 12.08.05 12:57
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| var tempMidScreenHeight,tempMidScreenWidth : Integer;
tempMidScreenHeight := Screen.Height div 2; tempMidScreenWidth := Screen.Width div 2; X2 := Screen.Height - (tempMidScreenHeight - ((VuMeter1.ValueRight * tempMidScreenHeight ) div 32768)); Y2 := Screen.Width - (tempMidScreenWidth -((VuMeter1.ValueRight * tempMidScreenWidth ) div 32768)); |
Moderiert von
raziel: Delphi-Tags hinzugefügt.
LigH - Fr 12.08.05 15:21
Als es noch was brachte (80286), hatte ich "div Zweierpotenz" auch mal ersetzt durch "shr Exponent", also
"div 2" = "shr 1"
"div 32768" = "shr 15"
Aber
1) lohnt sich das bei heutigen Prozessoren kaum noch,
2) schafft der Delphi-Optimizer solche Ersetzungen wahrscheinlich heute auch selber.
Dargor - Fr 12.08.05 17:10
Dass ich nicht selber darauf gekommen bin, die beiden Teile Screen.Height div 2 und Screen.Width div 2 auszulagern... immerhin wird das für JEDES x1 und y1 berechnet.
Werde das sofort erstmal probieren. Zusätzlich werde ich wohl dann auch noch den Tip von LigH ausprobieren.
Edit:
Konnte mit beiden Vorschlägen etwas über 5% an CPU-Last einsparen. Hab die Berechnung der beiden TempGrößen auch noch außerhalb des Loops verlagert - brauch ja nicht jedesmal neu berechnet werden, da man ja die Auflösung nicht ständig ändert.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!