Seite 1 von 1

Unterschiedlich schneller Code

Verfasst: 25.04.2018 22:48
von Peti
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

Re: Unterschiedlich schneller Code

Verfasst: 25.04.2018 22:51
von RSBasic
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.

Re: Unterschiedlich schneller Code

Verfasst: 26.04.2018 12:28
von Josh
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 ?
Das kann natürlich sein, je nachdem wie weit PureBasic den Code optiomiert. Schau dir folgendes Beispiel an:

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)
Dann Probiere das ganze mit X2 und X3, da wirst du sehen, dass diese beiden Varianten gleich schnell sind und schneller als die Variante X1. Pb kann bei der Variante X2 die gleiche Optimierung vornehmen, wie sie in X3 schon durch den Code vorgegeben ist.

Re: Unterschiedlich schneller Code

Verfasst: 26.04.2018 22:58
von chi
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