Seite 3 von 4

Re: Langsamer Code

Verfasst: 31.08.2019 13:45
von mk-soft
Zeiten YX zu XY

macOS (Host): 1742/1372
Window (VM): 4649/1457
Linux (VM): 2464/622

Interessant

Re: Langsamer Code

Verfasst: 31.08.2019 18:39
von NicTheQuick
Der Geschwindigkeitsunterschied hängt mit dem CPU-Cache zusammen. Aufeinanderfolgende Daten zu beschreiben ist immer schneller.

Re: Langsamer Code

Verfasst: 31.08.2019 20:39
von Kiffi
Windows: 1299 / 446
SpiderBasic: 3903 / 449 :wink:

Re: Langsamer Code

Verfasst: 31.08.2019 22:13
von Peti
Das mit dem vertauschen von X Y ist schon richtig. Habs nach meinem Post selber gemerkt ;)
So hatte ich in Blitz3D 500ms zu 559ms in PB also nur 10% langsamer in PB (damit kann ich leben). Der Code ist übrigens 1:1 der selbe der läuft so in beiden Basics sonst ergäbe es ja keinen Sinn. Werde mich mal schrittweise durch die wichtigsten und zeitkritischsten Befehle messen und schauen wie man das eine oder andere schneller kriegt.(vor allem die Division die macht mir sorgen )
Vielen Dank fürs Mittesten und wer noch weiss wie man am einfachsten zu den fehlenden 3D Befehlen kommt, was aktuelles (Vulkan ?) den hätte ich ganz lieb ;)

Re: Langsamer Code

Verfasst: 01.09.2019 01:41
von STARGÅTE
Peti hat geschrieben:... und wer noch weiss wie man am einfachsten zu den fehlenden 3D Befehlen kommt, was aktuelles (Vulkan ?) den hätte ich ganz lieb
Du kannst die Vulkan dll ganz normal mit OpenLibrary() in PureBasic einladen und dann alle Befehle mit GetFunction() einladen.
Für Konstanten und Prozedurparameter müsstest du ggf. die >>Header-Datei von Vulkan<< in PB umwandeln.
(Für OpenGL gibts sowas schon hier oder im englischen Forum, ggf. auch für Vulkan).

Re: Langsamer Code

Verfasst: 06.09.2019 12:16
von Blitzer
Zeiten YX zu XY
============
1. Betriebssystem Windows10 Enterprise
2. Betriebssystem Linux Deepin(15.11)
3. Betriebssystem MacOS 10.15 (Catalina) in VirtualBox unter Linux (2.)

zu 1.: Windows:
PureBasic: 721 zu 405
Blitzmax: 586 zu 83
*1) = B4J: 945 zu 48
*2) = Freebasic64 : 667 / 364

zu 2.: Linux:
PureBasic: 724 zu 409
BlitzMax: 542 zu 173

zu 3.: Virt. MacOX:
PureBasic: 1885 zu 441

*1) = B4J:

Code: Alles auswählen

'Non-UI application (console / server application)
#Region Project Attributes 
	#CommandLineArgs:
	#MergeLibraries: True 
#End Region

Sub Process_Globals
	Public d,x,y As Int
	Public Feld(1921,1081) As Int
	Public RGB=5646469 As Int
End Sub

Sub AppStart (Args() As String)
	
	Dim n As Long = DateTime.Now
	For d = 0 To 100
		For y = 0 To 1080
			For x = 0 To 1920
				Feld(x,y)=RGB
			Next
		Next
	Next
	Log($"1.Lauf: ${DateTime.Now - n}ms"$)
		
	Dim n As Long = DateTime.Now
	For d = 0 To 100
		For x = 0 To 1920
			For y = 0 To 1080
				Feld(x,y)=RGB
			Next
		Next
	Next
	Log($"2.Lauf: ${DateTime.Now - n}ms"$)
		
End Sub
Ganz schön flott für 'nicht natives' Java ...

*2) = FreeBasic64:

Code: Alles auswählen

dim as short d,x,y
dim as long wert
dim as double zeit
dim shared feld(1920,1080) as Integer
wert = 5646469
zeit = timer
for d = 0 to 100
   for y = 0 to 1080
      for x = 0 to 1920
         feld(x,y) = wert
      next
   next
next
print timer - zeit
zeit = timer
For d = 0 To 100
  For x = 0 To 1920
   For y = 0 To 1080
      feld(x,y) = wert
    Next
  Next
Next
print timer - zeit
Alle Werte in 64-bit von meinem Notebook.
(Nur zur Information)

Re: Langsamer Code

Verfasst: 10.09.2019 14:31
von juergenkulow
Hallo,

ich bekomme zu 2D-Zeichnungsfunktionsaufrufen merkwürdig lange Reaktionszeiten:
ein Durchlauf d to 1: 12 ms
StartDrawing: 185 ms StartDraw2: 358 ms
StopDrawing: 840 ms StopDrawing2:0 ms
ZeitInfo: DrawingBuffer() + DrawingBufferPitch() + DrawingBufferPixelFormat: 240 ms

Kann das bestätigt werden?
Gruß

Re: Langsamer Code

Verfasst: 12.09.2019 08:35
von Mijikai
juergenkulow hat geschrieben:Hallo,

ich bekomme zu 2D-Zeichnungsfunktionsaufrufen merkwürdig lange Reaktionszeiten:
ein Durchlauf d to 1: 12 ms
StartDrawing: 185 ms StartDraw2: 358 ms
StopDrawing: 840 ms StopDrawing2:0 ms
ZeitInfo: DrawingBuffer() + DrawingBufferPitch() + DrawingBufferPixelFormat: 240 ms

Kann das bestätigt werden?
Gruß
Gibts Code dazu?

Re: Langsamer Code

Verfasst: 12.09.2019 10:14
von juergenkulow
Hallo Mijikai,

nach einem Neustart bekomme ich völlig andere Werte:
ein Durchlauf d to 1: 14 ms
StartDrawing: 9 ms StartDraw2: 11 ms
StopDrawing: 25 ms StopDrawing2:0 ms
ZeitInfo: DrawingBuffer() + DrawingBufferPitch() + DrawingBufferPixelFormat: 3 ms

Hier der Testcode:

Code: Alles auswählen

; ImportC "E:\demo.obj" ; Laufwerk+Datei anpassen pocc /Tx64-coff E:/demo.c
;   demo(RGB.l,*Buffer,Pitch.l,ScreenWidth.l,ScreenHeight.l)
; EndImport
ExamineDesktops()
ScreenWidth.l=DesktopWidth(0)
ScreenHeight.l=DesktopHeight(0)
;#ScreenWidth = 1200 ;1920 
;#ScreenHeight = 1920 ; 1080
If InitSprite() = 0 Or InitKeyboard() = 0
  MessageRequester("Error", "DirectX is needed.",0)
EndIf
If OpenScreen(ScreenWidth, ScreenHeight, 32, "PB Plasma")
  RGB.l=255 <<24+255<<16+255<<8+0
  zeit=ElapsedMilliseconds()
  If StartDrawing(ScreenOutput())
    StartDraw=ElapsedMilliseconds()-zeit
    zeit=ElapsedMilliseconds()
    StopDrawing()
    ZeitStopDrawing=ElapsedMilliseconds()-zeit
    zeit=ElapsedMilliseconds()
    StartDrawing(ScreenOutput())  
    StartDraw2=ElapsedMilliseconds()-zeit
    zeit=ElapsedMilliseconds()
    Buffer = DrawingBuffer() ; Get the start address of the screen buffer
    Pitch.l = DrawingBufferPitch() ; Get the length (in byte) took by one horizontal line
    PixelFormat = DrawingBufferPixelFormat() ; Wird nicht genutzt könnte 1, 2, 3 Byte oder BGR oder Y umgekehrt sein. 
    ZeitInfo=ElapsedMilliseconds()-zeit
    zeit=ElapsedMilliseconds()
    DisableDebugger
    For d=1 To 1 ;100 x Screen mit Pixel beschreiben
                 ; demo(RGB,Buffer,Pitch,ScreenWidth-1,ScreenHeight-1)
      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 
    Dauer=ElapsedMilliseconds()-zeit
    
    EnableDebugger
    zeit=ElapsedMilliseconds()
    StopDrawing()
    ZeitStopDrawing2=ElapsedMilliseconds()-zeit
  EndIf  
  ;ExamineKeyboard()
  FlipBuffers()
  Delay(1000)
  ;FlipBuffers()
  CloseScreen()
  s.s="ein Durchlauf d to 1: "+Str(Dauer)+" ms"+#CRLF$+
      "StartDrawing: "+Str(StartDraw)+" ms StartDraw2: "+Str(StartDraw2)+" ms"+#CRLF$+
      " StopDrawing: "+Str(ZeitStopDrawing)+ " ms StopDrawing2:"+Str(ZeitStopDrawing2)+" ms"+#CRLF$+
      " ZeitInfo: DrawingBuffer() + DrawingBufferPitch() + DrawingBufferPixelFormat: "+Str(ZeitInfo)+" ms"
  SetClipboardText(s)
  MessageRequester(Str(Pitch)+"Zeitr",s,0)
  SetClipboardText(s)
Else
  MessageRequester("Error","Can't open the screen !",0)
EndIf

Gruß

Re: Langsamer Code

Verfasst: 12.09.2019 15:27
von Mijikai
Danke @juergenkulow

Hab mal etwas rumgespielt.

Ein Durchlauf (das Zeichnen aller Pixel) mit Start- StopDrawing() bei einer
Auflösung von 1920 x 1080 benötigt bei mir im Durchschnitt insgesamt 14 ms.

Von 14 ms werden nur 7 ms zum Zeichnen aller Pixel benötigt!
Die restlichen 7 ms verdampfen in den Start- & StopDrawing() Funktionen.

Jetzt bleibt die Frage was genau hier passiert.

Könnte es sein das hier nochmals alle Pixel durchgegangen
werden oder ist der Zugriff einfach nur langsam?