Seite 1 von 2

Schneller Rechnen

Verfasst: 03.01.2007 12:40
von Helle
Wenn für zeitaufwendige oder zeitkritische Berechnungen grösseren Umfangs als Rechnungs-Genauigkeit das normale Float (single-precision, Variable.f) ausreicht, kann man mal den nachfolgenden Code ausprobieren:

Code: Alles auswählen

;- Test, ob zwangsweises Reduzieren der FPU-Genauigkeit etwas bringt
;- "Helle" Klaus Helbing, 03.01.2007, PB v4.02  

Global CWO.w     
Global CWN.w
Global A.f = 12345
Global B.f = 67890
Global C.f

Procedure SetSingleFloat()
!fstcw [v_CWO]               ;Control-Word sichern
!mov ax,[v_CWO]
!and ax,1111110011111111b    ;die beiden Präzisions-Bit auf Null setzen = Single-Float
!mov [v_CWN],ax
!fldcw [v_CWN]               ;verändertes Control-Word zurückschreiben
EndProcedure 

Procedure RestoreCW()
!fldcw [v_CWO]               ;ursprüngliches Control-Word zurückschreiben
EndProcedure 

;-------- Test mit Original-Einstellungen
Time1 = ElapsedMilliseconds()

For i = 0 To 99999999
!Align 4                     ;nur für gleiche Testbedingungen, man kann mit und ohne testen 
 C = A * B                   ;irgendeine Rechnerei
 C = Sqr(C / A + B)
Next 

Time = ElapsedMilliseconds() - Time1 

MessageRequester("Test Original", Str(Time) + " ms   " + StrF(C))

;-------- Test mit Setzen auf Single-Precision
SetSingleFloat()
Time1 = ElapsedMilliseconds()

For i = 0 To 99999999
!Align 4                     ;nur für gleiche Testbedingungen, man kann mit und ohne testen 
 C = A * B                   ;irgendeine Rechnerei
 C = Sqr(C / A + B)          ;manche Rechenoperationen bringen viel, manche weniger, richten aber keinen Schaden an!
Next 

Time = ElapsedMilliseconds() - Time1 
RestoreCW()                  ;weil ich ordentlich bin ;-)

MessageRequester("Test Single-Precision", Str(Time) + " ms   " + StrF(C))
Für die praktische Anwendung sind nur die beiden Mini-Prozeduren interessant.
Gruss
Helle

Verfasst: 03.01.2007 20:51
von remi_meier
Tatsächlich
2 Sek. gegen 1.5 Sek. :allright:

Verfasst: 03.01.2007 22:31
von THEEX
@remi
2s vs 1.5 s? Was für einen Rechner bzw Prozi hast Du da?

Verfasst: 03.01.2007 22:35
von a14xerus
13830 vs. 7371
gleiches ergebnis
was bezweckt eigentlich

Code: Alles auswählen

!Align 4
?

/edit: zeit bezieht sich auf pentium 3 1000MHz ohne debugger und mit icq, opera und meinem player im hintergrund

Verfasst: 03.01.2007 22:45
von Fluid Byte
a14xerus hat geschrieben:was bezweckt eigentlich !Align 4
http://www.physik.uni-augsburg.de/~micheler/WinDLX-HTML-Help/help/.align.html hat geschrieben:Die Dateneinfügeadresse wird auf 2^Num ausgerichtet. Anders ausgedrückt wird die Dateneinfügeadresse auf die nächste Adresse gesetzt, die in ihrer Binärdarstellung die hintersten Num Bit auf 0 gesetzt hat. Zum Beispiel wird mit ".ALIGN 2" auf die nächste Wortgrenze weitergegangen.

Verfasst: 03.01.2007 22:52
von Frogger
2562ms vs 1625ms

joa bringt schon was

Verfasst: 04.01.2007 18:37
von THEEX
Wohl noch ein Rechner mit 20 Ghz

Verfasst: 04.01.2007 18:41
von THEEX
Ok, hab auch mal die Debuggerbremse abgeschaltet... ist i.O.

Verfasst: 04.01.2007 18:41
von Helle
Jungs, schaltet doch bitte für derartige Tests den Debugger aus :D !

Gruss
Helle

Ha, sehe schon. O.K.!

Verfasst: 04.01.2007 18:44
von Frogger
Wohl noch ein Rechner mit 20 Ghz
ne nur ein pentium 4 mit 3GHz :wink:

und ohne debugger :allright: