Aktuelle Zeit: 21.07.2018 17:02

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Unterschiedlich schneller Code
BeitragVerfasst: 25.04.2018 22:48 
Offline

Registriert: 25.04.2018 22:36
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.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Unterschiedlich schneller Code
BeitragVerfasst: 25.04.2018 22:51 
Offline
Moderator
Benutzeravatar

Registriert: 05.10.2006 18:55
Wohnort: Rupture Farms
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.

_________________
BildBildBildBild
Bild | EnableExplicit ist kostenlos und vermeidet Fehler | Gib Goto keine Chance | Schneller als die Telekom erlaubt | Avira? Nein Danke
WinAPI forever | Bei Problemen bitte Beispielcode posten | Mit Adblock werbefrei, schneller und sicherer surfen | brain.exe ist der beste Schutz | Userlibrary ohne Source = NoGo


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Unterschiedlich schneller Code
BeitragVerfasst: 26.04.2018 12:28 
Offline
Benutzeravatar

Registriert: 04.08.2009 17:24
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:
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Unterschiedlich schneller Code
BeitragVerfasst: 26.04.2018 22:58 
Offline
Benutzeravatar

Registriert: 17.05.2007 09:30
Wohnort: Linz - Austria
ASM bringt da ein wenig Licht in die Sache...
Code:
; 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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: Exabot [Bot] und 3 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye