Langsamer Code

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Langsamer Code

Beitrag von mk-soft »

Zeiten YX zu XY

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

Interessant
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Langsamer Code

Beitrag von NicTheQuick »

Der Geschwindigkeitsunterschied hängt mit dem CPU-Cache zusammen. Aufeinanderfolgende Daten zu beschreiben ist immer schneller.
Bild
Benutzeravatar
Kiffi
Beiträge: 10620
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Langsamer Code

Beitrag von Kiffi »

Windows: 1299 / 446
SpiderBasic: 3903 / 449 :wink:
Hygge
Peti
Beiträge: 7
Registriert: 25.04.2018 22:36

Re: Langsamer Code

Beitrag 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 ;)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Langsamer Code

Beitrag 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).
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Blitzer
Beiträge: 79
Registriert: 26.09.2004 14:33
Wohnort: Lower Saxony

Re: Langsamer Code

Beitrag 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)
Zuletzt geändert von Blitzer am 19.09.2019 13:36, insgesamt 2-mal geändert.
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: Langsamer Code

Beitrag 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ß
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Langsamer Code

Beitrag 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?
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: Langsamer Code

Beitrag 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ß
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Langsamer Code

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