Schneller Rechnen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Schneller Rechnen

Beitrag 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
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Tatsächlich
2 Sek. gegen 1.5 Sek. :allright:
THEEX
Beiträge: 804
Registriert: 07.09.2004 03:13

Beitrag von THEEX »

@remi
2s vs 1.5 s? Was für einen Rechner bzw Prozi hast Du da?
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag 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
Zuletzt geändert von a14xerus am 04.01.2007 21:15, insgesamt 1-mal geändert.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag 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.
Benutzeravatar
Frogger
Beiträge: 425
Registriert: 14.03.2006 19:27
Kontaktdaten:

Beitrag von Frogger »

2562ms vs 1625ms

joa bringt schon was
[PB4.20]
THEEX
Beiträge: 804
Registriert: 07.09.2004 03:13

Beitrag von THEEX »

Wohl noch ein Rechner mit 20 Ghz
THEEX
Beiträge: 804
Registriert: 07.09.2004 03:13

Beitrag von THEEX »

Ok, hab auch mal die Debuggerbremse abgeschaltet... ist i.O.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

Jungs, schaltet doch bitte für derartige Tests den Debugger aus :D !

Gruss
Helle

Ha, sehe schon. O.K.!
Benutzeravatar
Frogger
Beiträge: 425
Registriert: 14.03.2006 19:27
Kontaktdaten:

Beitrag von Frogger »

Wohl noch ein Rechner mit 20 Ghz
ne nur ein pentium 4 mit 3GHz :wink:

und ohne debugger :allright:
[PB4.20]
Antworten