Bin hier neu und habe die Demo von PureBasic heruntergeladen.
Beim Austesten ist mir folgendes aufgefallen, je nach dem, wie ich Formeln eingebe und wie lang sie sind oder unterteilt in kleinere Teilrechnungen
erzeugt der Compiler massiv unterschiedlich schnellen Code.
Kennt jemand dieses Verhalten und wie soll man es handeln ?
#ScreenWidth = 1920
#ScreenHeight = 1080
If InitSprite() = 0 Or InitKeyboard() = 0
MessageRequester("Error", "DirectX is needed.",0)
EndIf
If OpenScreen(#ScreenWidth, #ScreenHeight, 32, "PB Plasma")
zeit=ElapsedMilliseconds()
RGB=255 <<24+255<<16+255<<8+0
If StartDrawing(ScreenOutput())
Buffer = DrawingBuffer() ; Get the start address of the screen buffer
Pitch = DrawingBufferPitch() ; Get the length (in byte) took by one horizontal line
PixelFormat = DrawingBufferPixelFormat() ; Get the pixel format.
For d=1 To 100 ;100 x Screen mit Pixel beschreiben
For y = 0 To #ScreenHeight-1
For x = 0 To #ScreenWidth-1 ;Rechne alles in der innersten Klammer (auch y, nur Test)
;Var 1 Direkt in Klammer
;PokeL(buffer+Pitch*y+x*4,RGB) ;940 Millisec
;Var 2
;b=buffer+Pitch*y
;b=b+x*4
;PokeL(b,RGB) ;1920 Millisec
;Var 3
;h=Pitch*y
;b=x*4
;hb=h+b
;PokeL(buffer+hb,RGB) ;1656 Millisec
;Var 4
b=buffer+pitch*y+x*4
PokeL(b,RGB) ; 2625 Millisec
Next
Next
Next
StopDrawing()
EndIf
ExamineKeyboard()
FlipBuffers()
Else
MessageRequester("Error","Can't open the screen !",0)
EndIf
MessageRequester("Zeitr",Str(ElapsedMilliseconds()-zeit),0)
Das hab ich getestet und danke schon mal für Infos
__________________________________________________
Thread verschoben
FAQ & Tutorials>Allgemein
25.04.2018
RSBasic
Unterschiedlich schneller Code
Unterschiedlich schneller Code
Zuletzt geändert von Peti am 27.04.2018 01:16, insgesamt 2-mal geändert.
Re: Unterschiedlich schneller Code
Kannst du ein paar Beispiele posten?
\\Edit:
Du warst im falschen Unterforum. Ich habe deinen Thread verschoben.
\\Edit2:
Da du noch die Demo-Version verwendest, ist der Debugger soweit ich weiß stets aktiv. Deshalb sind Performance-Vergleiche nicht aussagekräftig, weil der Debug-Modus immer langsam ist. Aber poste trotzdem mal ein paar Beispiele, die unterschiedlich schnell laufen.
\\Edit:
Du warst im falschen Unterforum. Ich habe deinen Thread verschoben.
\\Edit2:
Da du noch die Demo-Version verwendest, ist der Debugger soweit ich weiß stets aktiv. Deshalb sind Performance-Vergleiche nicht aussagekräftig, weil der Debug-Modus immer langsam ist. Aber poste trotzdem mal ein paar Beispiele, die unterschiedlich schnell laufen.
Re: Unterschiedlich schneller Code
Das kann natürlich sein, je nachdem wie weit PureBasic den Code optiomiert. Schau dir folgendes Beispiel an:Peti hat geschrieben:Bin hier neu und habe die Demo von PureBasic heruntergeladen.
Beim Austesten ist mir folgendes aufgefallen, je nach dem, wie ich Formeln eingebe und wie lang sie sind oder unterteilt in kleinere Teilrechnungen
erzeugt der Compiler massiv unterschiedlich schnellen Code.
Kennt jemand dieses Verhalten und wie soll man es handeln ?
Code: Alles auswählen
time = ElapsedMilliseconds()
a = 3
For i = 1 To 100000000
x1 = 1 * a * 2 * a * 3 * a * 4 * a * 5 * a * 6 * a
;x2 = 1 * 2 * 3 * 4 * 5 * 6 * a * a * a * a * a * a
;x3 = 720 * a * a * a * a * a * a
Next
time = ElapsedMilliseconds() - time
MessageRequester ("", "" + time)
Re: Unterschiedlich schneller Code
ASM bringt da ein wenig Licht in die Sache...
Code: Alles auswählen
; x1 = 1 * a * 2 * a * 3 * a * 4 * a * 5 * a * 6 * a
MOV ebx,dword [v_a]
ADD ebx,ebx
IMUL ebx,dword [v_a]
IMUL ebx,3
IMUL ebx,dword [v_a]
SAL ebx,2
IMUL ebx,dword [v_a]
IMUL ebx,5
IMUL ebx,dword [v_a]
IMUL ebx,6
IMUL ebx,dword [v_a]
MOV dword [v_x1],ebx
; x2 = 1 * 2 * 3 * 4 * 5 * 6 * a * a * a * a * a * a
MOV ebx,dword [v_a]
IMUL ebx,720
IMUL ebx,dword [v_a]
IMUL ebx,dword [v_a]
IMUL ebx,dword [v_a]
IMUL ebx,dword [v_a]
IMUL ebx,dword [v_a]
MOV dword [v_x2],ebx
; x3 = 720 * a * a * a * a * a * a
MOV ebx,dword [v_a]
IMUL ebx,720
IMUL ebx,dword [v_a]
IMUL ebx,dword [v_a]
IMUL ebx,dword [v_a]
IMUL ebx,dword [v_a]
IMUL ebx,dword [v_a]
MOV dword [v_x3],ebx