Unterschiedlich schneller Code

Für allgemeine Fragen zur Programmierung mit PureBasic.
Peti
Beiträge: 7
Registriert: 25.04.2018 22:36

Unterschiedlich schneller Code

Beitrag 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
Zuletzt geändert von Peti am 27.04.2018 01:16, insgesamt 2-mal geändert.
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Unterschiedlich schneller Code

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Unterschiedlich schneller Code

Beitrag 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.
Benutzeravatar
chi
Beiträge: 90
Registriert: 17.05.2007 09:30
Wohnort: Linz - Austria

Re: Unterschiedlich schneller Code

Beitrag 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
Antworten