Italia
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 per 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!)

endpr
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 circa 40% beschleunigt.
Saluto
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: naturalmente 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


Saluto
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  
 



Answer


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

2.370 Views

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

Themeninformationen

Dieses Thema hat 2 subscriber:

RGH (3x)
iF (2x)


Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


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