Deutsch
Wünsche und Anregungen

X11Beta6: between gegen case/if

 
Ich verstehe etwas nicht! Mein Performancevergleich zwischen Between und einer eigenen Funktion hat ergeben das die eigene Funktion deutlich schneller arbeitet.

Ich habe vielleicht aber auch falsch getestet! Hier mein Test für Between (wird bei mir 18.000 mal abgearbeitet)
KompilierenMarkierenSeparieren
var BALL.XS!=0
var BALL.YS!=0
var BALL.RS!=0
CLS
var TME&=&GETTICKCOUNT+3000
var C&=0

WHILE &GETTICKCOUNT<TME&

    C&=C&+1
    PERFPROC()

ENDWHILE

PRINT C&
WAITINPUT
END

proc PERFPROC

    BALL.XS!=RND(40)-20
    BALL.YS!=RND(40)-20
    RETURN RECTINTERSECT(BALL.XS!,BALL.YS!,100,100,50,50,200,200)

endproc

proc RECTINTERSECT

    PARAMETERS X!,Y!,XX!,YY!,XXX!,YYY!,XXXX!,YYYY!
    RETURN BETWEEN(X!,XXX!,XXXX!,Y!,XXX!,YYYY!) OR BETWEEN(XX!,XXX!,XXXX!,YY!,XXX!,YYYY!)

endproc


Und hier die schnellere eigene Version (wird bei mir 21.000 mal abgearbeitet)
KompilierenMarkierenSeparieren
var BALL.XS!=0
var BALL.YS!=0
var BALL.RS!=0
CLS
var TME&=&GETTICKCOUNT+3000
var C&=0

WHILE &GETTICKCOUNT<TME&

    C&=C&+1
    PERFPROC()

ENDWHILE

PRINT C&
WAITINPUT
END

proc PERFPROC

    BALL.XS!=RND(40)-20
    BALL.YS!=RND(40)-20
    RETURN RECTINTERSECT(BALL.XS!,BALL.YS!,100,100,50,50,200,200)

endproc

proc RECTINTERSECT

    PARAMETERS X!,Y!,XX!,YY!,XXX!,YYY!,XXXX!,YYYY!

    IF (XX!<XXX!) OR (X!>XXXX!)

        RETURN 0

    ENDIF

    IF (YY!<YYY!) OR (Y!>YYYY!)

        RETURN 0

    ENDIF

    RETURN 1

endproc


Die schnellere Version hat mehr XProfanzeilen, ich hätte gemeint das Between im or-Doppelpack trotzdem schneller ist.
 
22.11.2007  
 



Ich sehe grad das
KompilierenMarkierenSeparieren
proc RECTINTERSECT

    PARAMETERS X!,Y!,XX!,YY!,XXX!,YYY!,XXXX!,YYYY!
    RETURN BETWEEN(X!,XXX!,XXXX!,Y!,XXX!,YYYY!) OR BETWEEN(XX!,XXX!,XXXX!,YY!,XXX!,YYYY!)

endproc

sowieso falsch ist, aber das sollte im Bezug auf den Geschwindigkeitstest keinen Einfluss haben.
 
23.11.2007  
 




RGH
Versuche es mal mit der neuen Funktion INTERSECT():
KompilierenMarkierenSeparieren
var BALL# = new(xpRect)
BALL#.posx! = 0
BALL#.posy! = 0
BALL#.x! = 100
BALL#.y! = 100
var TEST# = new(xpRect)
TEST#.posx! = 50
TEST#.posy! = 50
TEST#.x! = 150
TEST#.y! = 150
CLS
var TME&=&GETTICKCOUNT+3000
var C&=0

WHILE &GETTICKCOUNT<TME&

    C&=C&+1
    PERFPROC()

ENDWHILE

PRINT C&
WAITINPUT
END

proc PERFPROC

    BALL#.posx! = RND(40)-20
    BALL#.posy! = RND(40)-20
    RETURN RECTINTERSECT(BALL#, TEST#)

endproc

proc RECTINTERSECT

    PARAMETERS X#, Y#

    IFNOT INTERSECT(r, X#, Y#)

        RETURN 0

    ENDIF

    RETURN 1

endproc


Die letzer Prozedur ist nur wegen der Vergleichbarkeit da. Natürlich würde mach auf diese verzichten und oben gleich INTERSECT(s, BALL#, TEST#) schreiben, was die Geschichte nochmal um über 40% beschleunigt.
Gruß
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
24.11.2007  
 




RGH
Ach ja: natürlich würde man bei Bällen die Struktur xpSphere verwenden:
KompilierenMarkierenSeparieren
var BALL# = new(xpSphere)
BALL#.posx! = 0
BALL#.posy! = 0
BALL#.x! = 100
var TEST# = new(xpSphere)
TEST#.posx! = 50
TEST#.posy! = 50
TEST#.x! = 100
CLS
var TME&=&GETTICKCOUNT+3000
var C&=0

WHILE &GETTICKCOUNT<TME&

    C&=C&+1
    PERFPROC()

ENDWHILE

PRINT C&
WAITINPUT
END

proc PERFPROC

    BALL#.posx! = RND(40)-20
    BALL#.posy! = RND(40)-20
    RETURN INTERSECT(s, BALL#, TEST#)

endproc

 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
24.11.2007  
 




RGH
iF
Ich verstehe etwas nicht! Mein Performancevergleich zwischen Between und einer eigenen Funktion hat ergeben das die eigene Funktion deutlich schneller arbeitet.
Die schnellere Version hat mehr XProfanzeilen, ich hätte gemeint das Between im or-Doppelpack trotzdem schneller ist.


Hallo iF,

was XProfan-intern ziemlich viel Zeit verbraucht, ist das Auswerten von Parametern, egal ob als Funktionsparameter in Klammern oder als Prozedur-Parameter mit PARAMETERS. In Deinem Beispiel mit BETWEEN gibt es davon eine stattliche Anzahl mehr, als in dem ohne (20 hier und 8 dort).
Der Vorteil von BETWEEN ist hier der, dass Du eigentlich keine eigene Proztedur RECTINTERSECT mehr brauchst und den Einzeiler direkt einsetzen kannst. Schon reduzieren sich die übergebenen Parameter von 20 auf 12 ... und schon ist das Ganze doppelt so schnell (obwohl es immer noch 4 Parameterübergaben mehr sind):
KompilierenMarkierenSeparieren
var BALL.XS!=0
var BALL.YS!=0
CLS
var TME&=&GETTICKCOUNT+3000
var C&=0

WHILE &GETTICKCOUNT<TME&

    C&=C&+1
    PERFPROC()

ENDWHILE

PRINT C&
WAITINPUT
END

proc PERFPROC

    BALL.XS!=RND(40)-20
    BALL.YS!=RND(40)-20
    RETURN BETWEEN(BALL.XS!,50,200,BALL.YS!,50,200) OR
    BETWEEN(100,50,200,100,50,200)

endproc


Gruß
Roland
 
Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4
24.11.2007  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

2.388 Betrachtungen

Unbenanntvor 0 min.
H.Brill24.09.2023
holmol9330.05.2013
Torben Nissen12.02.2012
bastler17.01.2011

Themeninformationen

Dieses Thema hat 2 Teilnehmer:

RGH (3x)
iF (2x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie