002
20.10.2006, 15:20 Uhr
ao
(Operator)
|
Viel Potential sehe ich da nicht, aber etwas schon
1. Doppelte Berechnungen vermeiden ( (j-x) * (j-x) ), stattdessen Zwischenergebnisse speichern:
C++: |
int f1 = j - x; int f2 = i - y; r = (long) sqrt (f1 * f1 + f2 * f2);
|
2. Die float-Casts sind unnötig. Erstens muss man nicht die Produkte einzeln casten, um sie dann zu addieren. Addiere zuerst und caste dann, dadurch entfällt ein Cast. Zweitens erwartet sqrt ein double-Argument, und der Compiler wandelt long nach double automatisch bei Bedarf. Der erzwungene float-Cast ist also ein Umweg.
Der Rück-Cast auf long bei Zuweisung der Wurzel an r erfolgt ebenfalls automatisch, allerdings kann es sein, dass der Compiler eine Warnung wirft, wenn du ihn weglässt ("Conversion loses precision" oder so). Schreib ihn hin, er schadet nicht.
3. Die Indexberechnung kann man umstellen:
C++: |
index = (x * iHeight + y * MAXRADIUS + r) / 2;
|
Dadurch hast du nur eine Division anstatt drei. Aber aufpassen, ob dadurch ein Überlauf entstehen kann! Auch hier sind sämtliche Casts bis auf den letzten ( (long)(( fBetrag * fValue )) ) unnötig, weil nur Ganzzahlen beteiligt sind und daher komplett im long-Format gerechnet wird. Oder ist MAXRADIUS eine Fließkomma-Konstante?
4. Was sich richtig lohnen könnte, ist ein kritischer Blick auf die drei geschachtelten Schleifen. Zeig doch mal die Schleifenköpfe und welche Schleife über welche Schleifenvariable läuft und so. Eventuell kann man einen Teilausdruck weiter nach außen ziehen, so dass der nicht in jedem innersten Durchlauf neu berechnet werden muss.
ao |