Schneller Rechnen
Verfasst: 03.01.2007 12:40
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:
Für die praktische Anwendung sind nur die beiden Mini-Prozeduren interessant.
Gruss
Helle
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))
Gruss
Helle