| |
|
|
| 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) KompilierenMarkierenSeparierenvar 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) KompilierenMarkierenSeparierenvar 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. |
|
|
| |
|
|
|
| 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. |
|
|
| |
|
|
|
RGH | Versuche es mal mit der neuen Funktion INTERSECT(): KompilierenMarkierenSeparieren 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 | |
|
| 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): KompilierenMarkierenSeparierenvar 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 ▲ |
|
|
|