Seite 1 von 2

enormer performance Einbruch bei PB v5.21

Verfasst: 08.12.2013 20:31
von captain_hesse
Hallo zusammen.
Ich habe gerade mal mein Schachprogramm mit der neusten Version von PB gestartet und musste mit Entsetzen feststellen das die Ausführungsgeschwindigkeit um gute 40-50% langsamer ist als noch bei Version 5.20 oder früher ohne was am Quellcode zu ändern woran könnte das liegen ? Der Debugger ist natürlich ausgeschaltet und alle Einstellungen, soweit ich das sehe sind gleich. Muss ich da vielleicht was beim zugriff auf Arrays oder Structuren beachten oder optimiert der Compiler nicht mehr so gut :? ?

MfG.
Armin

Re: enormer performance Einbruch bei PB v5.21

Verfasst: 09.12.2013 01:19
von SBond
...hast du mal versucht die Quelle zu lokalisieren?

Ich habe gerade mal einen Test gemacht und nur minimale unterschiede zwischen 5.11 und 5.21 festgestellt.



Hier ist mein wahrscheinlich erstes Tool, das ich mal mit PB geschrieben habe. Es ist nicht toll, aber zweckmäßig.
Du kannst es ja mal mit der neuen und der alten PB-Version testen.

Code: Alles auswählen

Enumeration
	#GUI
	#Statusleiste
	#Image_Buffer
	#Image_Zeichenflaeche
	
EndEnumeration


	X_aktueller_Wert.d 	= 0
	Y_aktueller_Wert.d	= 0
	X_letzer_Wert.d 	= 0
	Y_letzer_Wert.d		= 0

	Counter_Sin.d 		= 0
	Counter_Messung		= 0
	Counter_FPS			= 0
	
	Zeit_Messung		= 0
	Zeit_FPS			= 0
	
	FPS					= 0
	
	aktueller_Test		= 1
	bearbeite_Test		= 0
	
	Test_1_Werte		= 0
	Test_1_FPS			= 0
	Test_2_Werte		= 0
	Test_2_FPS			= 0
	Test_3_Werte		= 0
	Test_3_FPS			= 0
	Test_4_Werte		= 0
	Test_4_FPS			= 0
	
	
	Zahl_1.i			= 0
	Zahl_2.d			= 0
	
	Zeit.i				= 0
	Text.s				= "aaaaaaaaa"
	
	Ergebnis_Test_1		= 0
	Ergebnis_Test_2		= 0
	Ergebnis_Test_3		= 0	
	
	
	
	
; Konsolen-Fenster erstellen
If OpenConsole()
	
	EnableGraphicalConsole(1)
	ConsoleCursor(0)
	
	ConsoleLocate ( 0, 0):	ConsoleColor( 7, 0):	Print("Performance-Test: Programmiersprache PureBasic")
    ConsoleLocate ( 0, 1):	ConsoleColor( 7, 0):	Print("------------------------------------------------------------")
    ConsoleLocate ( 0, 4):	ConsoleColor( 7, 0):	Print("[    ]   Test 1: Ganzzahl von 0 bis 1.000.000.000 hochzählen"):      ConsoleLocate (65, 4):	ConsoleColor( 7, 0):	Print("[           ]");
    ConsoleLocate ( 0, 5):	ConsoleColor( 7, 0):	Print("[    ]   Test 2: Gleitkommazahl von 0 bis 1.000.000 hochzählen"):    ConsoleLocate (65, 5):	ConsoleColor( 7, 0):	Print("[           ]");
    ConsoleLocate ( 0, 6):	ConsoleColor( 7, 0):	Print("[    ]   Test 3: Stringinhalt 100.000.000 mal ändern"):            	ConsoleLocate (65, 6):	ConsoleColor( 7, 0):	Print("[           ]");
    ConsoleLocate ( 0, 7):	ConsoleColor( 7, 0):	Print("[    ]   Grafik 1: direkt in die GUI zeichnen"):           	 		ConsoleLocate (54, 7):	ConsoleColor( 7, 0):	Print("[        ] [           ]");
    ConsoleLocate ( 0, 8):	ConsoleColor( 7, 0):	Print("[    ]   Grafik 2: in Backbuffer zeichnen"):           			 	ConsoleLocate (54, 8):	ConsoleColor( 7, 0):	Print("[        ] [           ]");
    ConsoleLocate ( 0, 9):	ConsoleColor( 7, 0):	Print("[    ]   Grafik 3: in Backbuffer zeichnen (skaliert)"):           	ConsoleLocate (54, 9):	ConsoleColor( 7, 0):	Print("[        ] [           ]");
    ConsoleLocate ( 0,10):	ConsoleColor( 7, 0):	Print("[    ]   Grafik 4: in Backbuffer zeichnen (Rauschen)"):           	ConsoleLocate (54,10):	ConsoleColor( 7, 0):	Print("[        ] [           ]");
    
    ConsoleLocate ( 0,16):	ConsoleColor( 7, 0):	Print("zu Test 2: die Schrittweite ist 0,001")
    ConsoleLocate ( 0,17):	ConsoleColor( 7, 0):	Print("FPS:       Darstellungen des kompletten Graphen pro Sekunde")
    ConsoleLocate ( 0,18):	ConsoleColor( 7, 0):	Print("W/s:       Werte die pro Sekunde geplottet werden")
    ConsoleLocate ( 0,22):	ConsoleColor( 7, 0):	Print("by SBond, 09.06.2013")
    


	; Test 1
	ConsoleLocate ( 2, 4):	ConsoleColor(10, 0):	Print("->")
	Zeit = ElapsedMilliseconds()

	While (Zahl_1 <= 1000000000)
		Zahl_1 + 1		
	Wend
	
	Ergebnis_Test_1 = ElapsedMilliseconds() - Zeit
	ConsoleLocate ( 2, 4):	ConsoleColor(10, 0):	Print("ok")
	ConsoleLocate (74 - Len(StrU(Ergebnis_Test_1)), 4):	ConsoleColor(14, 0):	Print(StrU(Ergebnis_Test_1) + " ms")
	
	
	
	; Test 2
	ConsoleLocate ( 2, 5):	ConsoleColor(10, 0):	Print("->")
	Zeit = ElapsedMilliseconds()
	
	While (Zahl_2 <= 1000000)
		
		Zahl_2 + 0.001
		
	Wend
		
	Ergebnis_Test_2 = ElapsedMilliseconds() - Zeit
	ConsoleLocate ( 2, 5):	ConsoleColor(10, 0):	Print("ok")
	ConsoleLocate (74 - Len(StrU(Ergebnis_Test_2)), 5):	ConsoleColor(14, 0):	Print(StrU(Ergebnis_Test_2) + " ms")	
	
	
	
	; Test 3
	ConsoleLocate ( 2, 6):	ConsoleColor(10, 0):	Print("->")
	Zeit = ElapsedMilliseconds()
	
	For	i = 0 To 10000000 Step 1
		
		Text = "aaaaaaaaa"
		Text = "bbbbbbbbb"
		Text = "ccccccccc"
		Text = "ddddddddd"
		Text = "eeeeeeeee"
		Text = "fffffffff"
		Text = "ggggggggg"
		Text = "hhhhhhhhh"
		Text = "iiiiiiiii"
		Text = "123456789"
		
	Next
		
	Ergebnis_Test_3 = ElapsedMilliseconds() - Zeit
	ConsoleLocate ( 2, 6):	ConsoleColor(10, 0):	Print("ok")
	ConsoleLocate (74 - Len(StrU(Ergebnis_Test_3)), 6):	ConsoleColor(14, 0):	Print(StrU(Ergebnis_Test_3) + " ms")
	


	
	; GUI-Fenster erstellen
	If (OpenWindow(#GUI, 0, 0, 800, 423, "PureBasic 2D-Drawing-Test", #PB_Window_ScreenCentered | #PB_Window_SystemMenu))
	
	
		
		; Statusleiste erstellen
		If (CreateStatusBar(#Statusleiste, WindowID(#GUI)))
			AddStatusBarField(350)
			AddStatusBarField(100)
			AddStatusBarField(150)
			AddStatusBarField(200)
			StatusBarText		(#Statusleiste, 0, "starte Tests...")
			StatusBarProgress	(#Statusleiste, 1, 0)
			StatusBarText		(#Statusleiste, 2, "0 Werte/sek")
			StatusBarText		(#Statusleiste, 3, "0 FPS")
		EndIf
		
	
		; die Grafikelemente erstellen
		CreateImage(#Image_Buffer, 800, 400)													; Bild, auf dem gezeichnet wird
		ImageGadget(#Image_Zeichenflaeche, 0, 0, 800, 400, ImageID(#Image_Buffer))				; Gadget, auf dem das Bild angezeigt werden kann
		StartDrawing(ImageOutput(#Image_Buffer))												; startet den Zeichenvorgang
		
		;Hintergrund leeren
		Box(0, 0, 800, 400, RGB(255,255,255))
	
		StopDrawing()																			; stoppt den Zeichenvorgang
		SetGadgetState(#Image_Zeichenflaeche, ImageID(#Image_Buffer))							; zeichnet das Bild in die GUI
		StartDrawing(ImageOutput(#Image_Buffer))												; startet den Zeichenvorgang
		
	
		Delay(2000)

		
		Repeat
			
			; Test 1: in den Frontbuffer zeichnen (10 sek)
			If (aktueller_Test = 1)
				
				; Test wird gestartet
				If (bearbeite_Test = 0)
					
					; Graph in die GUI zeichnen
					StopDrawing()													
					SetGadgetState(#Image_Zeichenflaeche, ImageID(#Image_Buffer))	
					StartDrawing(ImageOutput(#Image_Buffer))
					ConsoleLocate ( 2, 7):	ConsoleColor(10, 0):	Print("->")
			
					;Hintergrund leeren
					Box(0, 0, 800, 400, RGB(255,255,255))	
					
					StopDrawing()	
					StartDrawing(WindowOutput(#GUI))
	
					StatusBarText		(#Statusleiste, 0, "Test 1: direkt in die GUI zeichnen (10 sek)")
					StatusBarProgress	(#Statusleiste, 1, 0)
					StatusBarText		(#Statusleiste, 2, "0 Werte/sek")
					StatusBarText		(#Statusleiste, 3, "0 FPS")			
					
					bearbeite_Test	= 1
					Counter_FPS		= 0
					Counter_Messung	= 0
					
					Zeit_Messung 	= ElapsedMilliseconds()
					Zeit_FPS		= ElapsedMilliseconds()
	
				EndIf
				
				
				
				; FPS berechnen
				If (ElapsedMilliseconds() - Zeit_FPS >= 1000)
					StatusBarProgress	(#Statusleiste, 1, (ElapsedMilliseconds() - Zeit_Messung) / 100)
					StatusBarText		(#Statusleiste, 2, StrU(Counter_FPS) + " Werte/sek")
					StatusBarText		(#Statusleiste, 3, StrU(Counter_FPS / 800) + " FPS")
					Zeit_FPS		= ElapsedMilliseconds()
					Counter_FPS		= 0
				Else
					Counter_FPS 	+ 1
				EndIf
				
				
				
				If (ElapsedMilliseconds() - Zeit_Messung >= 10000)
					StatusBarProgress	(#Statusleiste, 1, (ElapsedMilliseconds() - Zeit_Messung) / 100)
					StatusBarText		(#Statusleiste, 2, StrU(Counter_Messung / 10) + " Werte/sek")
					StatusBarText		(#Statusleiste, 3, StrU(Counter_Messung / (800*10)) + " FPS")
					Test_1_Werte		= Counter_Messung / 10
					Test_1_FPS			= Counter_Messung / (800*10)
					ConsoleLocate ( 2, 7):	ConsoleColor(10, 0):	Print("ok")
					ConsoleLocate (59 - Len(StrU(Test_1_FPS)), 7):		ConsoleColor(14, 0):	Print(StrU(Test_1_FPS) + " FPS")
					ConsoleLocate (73 - Len(StrU(Test_1_Werte)), 7):	ConsoleColor(14, 0):	Print(StrU(Test_1_Werte) + " W/s")
					aktueller_Test		= 2
					bearbeite_Test		= 0
					
					
				Else
					Counter_Messung + 1
					
					Counter_Sin + 0.007847
					Y_aktueller_Wert = 200 + Sin(Counter_Sin)*180
			
					; Graph plotten
					LineXY(X_aktueller_Wert - 1, 400 - Y_letzer_Wert, X_aktueller_Wert, 400 - Y_aktueller_Wert, $FF0000)
					Y_letzer_Wert = Y_aktueller_Wert
					
					; X-Position weiterrücken, wenn der Graph noch nicht voll ist
					If X_aktueller_Wert < 800
						X_aktueller_Wert 	+ 1
					Else	
						X_aktueller_Wert 	= 0
						Box(0, 0, 800, 400, RGB(255,255,255))	
					EndIf
				
				EndIf			
	
			ElseIf (aktueller_Test = 2)
				
				; Test wird gestartet
				If (bearbeite_Test = 0)
					
					; Graph in die GUI zeichnen
					StopDrawing()													
					SetGadgetState(#Image_Zeichenflaeche, ImageID(#Image_Buffer))	
					StartDrawing(ImageOutput(#Image_Buffer))
					ConsoleLocate ( 2, 8):	ConsoleColor(10, 0):	Print("->")
			
					;Hintergrund leeren
					Box(0, 0, 800, 400, RGB(255,255,255))	
	
					StatusBarText		(#Statusleiste, 0, "Test 2: in den Backbuffer zeichnen (10 sek)")
					StatusBarProgress	(#Statusleiste, 1, 0)
					StatusBarText		(#Statusleiste, 2, "0 Werte/sek")
					StatusBarText		(#Statusleiste, 3, "0 FPS")			
					
					bearbeite_Test	= 1
					Counter_FPS		= 0
					Counter_Messung	= 0
					
					Zeit_Messung 	= ElapsedMilliseconds()
					Zeit_FPS		= ElapsedMilliseconds()
	
				EndIf
				
				
				
				; FPS berechnen
				If (ElapsedMilliseconds() - Zeit_FPS >= 1000)
					StatusBarProgress	(#Statusleiste, 1, (ElapsedMilliseconds() - Zeit_Messung) / 100)
					StatusBarText		(#Statusleiste, 2, StrU(Counter_FPS) + " Werte/sek")
					StatusBarText		(#Statusleiste, 3, StrU(Counter_FPS / 800) + " FPS")
					Zeit_FPS		= ElapsedMilliseconds()
					Counter_FPS		= 0
				Else
					Counter_FPS 	+ 1
				EndIf
				
				
				
				If (ElapsedMilliseconds() - Zeit_Messung >= 10000)
					StatusBarProgress	(#Statusleiste, 1, (ElapsedMilliseconds() - Zeit_Messung) / 100)
					StatusBarText		(#Statusleiste, 2, StrU(Counter_Messung / 10) + " Werte/sek")
					StatusBarText		(#Statusleiste, 3, StrU(Counter_Messung / (800*10)) + " FPS")
					Test_2_Werte		= Counter_Messung / 10
					Test_2_FPS			= Counter_Messung / (800*10)
					ConsoleLocate ( 2, 8):	ConsoleColor(10, 0):	Print("ok")
					ConsoleLocate (59 - Len(StrU(Test_2_FPS)), 8):		ConsoleColor(14, 0):	Print(StrU(Test_2_FPS) + " FPS")
					ConsoleLocate (73 - Len(StrU(Test_2_Werte)), 8):	ConsoleColor(14, 0):	Print(StrU(Test_2_Werte) + " W/s")
					aktueller_Test		= 3
					bearbeite_Test		= 0
					
					
				Else
					Counter_Messung + 1
					
					Counter_Sin + 0.007847
					Y_aktueller_Wert = 200 + Sin(Counter_Sin)*180
			
					; Graph plotten
					LineXY(X_aktueller_Wert - 1, 400 - Y_letzer_Wert, X_aktueller_Wert, 400 - Y_aktueller_Wert, $FF0000)
					Y_letzer_Wert = Y_aktueller_Wert
					
					; X-Position weiterrücken, wenn der Graph noch nicht voll ist
					If X_aktueller_Wert < 800
						X_aktueller_Wert 	+ 1
					Else	
						X_aktueller_Wert 	= 0
						
						; Graph in die GUI zeichnen
						StopDrawing()													
						SetGadgetState(#Image_Zeichenflaeche, ImageID(#Image_Buffer))	
						StartDrawing(ImageOutput(#Image_Buffer))
				
						;Hintergrund leeren
						Box(0, 0, 800, 400, RGB(255,255,255))	
					EndIf
				
				EndIf			
	
			ElseIf (aktueller_Test = 3)
				
				; Test wird gestartet
				If (bearbeite_Test = 0)
					
					; Graph in die GUI zeichnen
					StopDrawing()													
					SetGadgetState(#Image_Zeichenflaeche, ImageID(#Image_Buffer))	
					StartDrawing(ImageOutput(#Image_Buffer))
					ConsoleLocate ( 2, 9):	ConsoleColor(10, 0):	Print("->")
			
					;Hintergrund leeren
					Box(0, 0, 800, 400, RGB(255,255,255))	
	
					StatusBarText		(#Statusleiste, 0, "Test 3: in den Backbuffer zeichnen; skaliert mit Faktor 10")
					StatusBarProgress	(#Statusleiste, 1, 0)
					StatusBarText		(#Statusleiste, 2, "0 Werte/sek")
					StatusBarText		(#Statusleiste, 3, "0 FPS")			
					
					bearbeite_Test	= 1
					Counter_FPS		= 0
					Counter_Messung	= 0
					
					Zeit_Messung 	= ElapsedMilliseconds()
					Zeit_FPS		= ElapsedMilliseconds()
	
				EndIf
				
				
				
				; FPS berechnen
				If (ElapsedMilliseconds() - Zeit_FPS >= 1000)
					StatusBarProgress	(#Statusleiste, 1, (ElapsedMilliseconds() - Zeit_Messung) / 100)
					StatusBarText		(#Statusleiste, 2, StrU(Counter_FPS) + " Werte/sek")
					StatusBarText		(#Statusleiste, 3, StrU(Counter_FPS / (800*10)) + " FPS")
					Zeit_FPS		= ElapsedMilliseconds()
					Counter_FPS		= 0
				Else
					Counter_FPS 	+ 1
				EndIf
				

				If (ElapsedMilliseconds() - Zeit_Messung >= 10000)
					StatusBarProgress	(#Statusleiste, 1, (ElapsedMilliseconds() - Zeit_Messung) / 100)
					StatusBarText		(#Statusleiste, 2, StrU(Counter_Messung / 10) + " Werte/sek")
					StatusBarText		(#Statusleiste, 3, StrU(Counter_Messung / (800*10*10)) + " FPS")
					Test_3_Werte		= Counter_Messung / 10
					Test_3_FPS			= Counter_Messung / (800*10*10)
					ConsoleLocate ( 2, 9):	ConsoleColor(10, 0):	Print("ok")
					ConsoleLocate (59 - Len(StrU(Test_3_FPS)), 9):		ConsoleColor(14, 0):	Print(StrU(Test_3_FPS) + " FPS")
					ConsoleLocate (73 - Len(StrU(Test_3_Werte)), 9):	ConsoleColor(14, 0):	Print(StrU(Test_3_Werte) + " W/s")
					aktueller_Test		= 4
					bearbeite_Test		= 0
					
					
				Else
					Counter_Messung + 1
					
					Counter_Sin + 0.007847
					Y_aktueller_Wert = 200 + Sin(Counter_Sin)*180
			
					; Graph plotten
					LineXY(X_aktueller_Wert - 1, 400 - Y_letzer_Wert, X_aktueller_Wert, 400 - Y_aktueller_Wert, $FF0000)
					Y_letzer_Wert = Y_aktueller_Wert
					
					; X-Position weiterrücken, wenn der Graph noch nicht voll ist
					If X_aktueller_Wert < 800
						X_aktueller_Wert 	+ 0.1
					Else	
						X_aktueller_Wert 	= 0
						
						; Graph in die GUI zeichnen
						StopDrawing()													
						SetGadgetState(#Image_Zeichenflaeche, ImageID(#Image_Buffer))	
						StartDrawing(ImageOutput(#Image_Buffer))
				
						;Hintergrund leeren
						Box(0, 0, 800, 400, RGB(255,255,255))	
					EndIf
				
				EndIf			
	
			ElseIf (aktueller_Test = 4)
				
				; Test wird gestartet
				If (bearbeite_Test = 0)
					
					; Graph in die GUI zeichnen
					StopDrawing()													
					SetGadgetState(#Image_Zeichenflaeche, ImageID(#Image_Buffer))	
					StartDrawing(ImageOutput(#Image_Buffer))
					ConsoleLocate ( 2,10):	ConsoleColor(10, 0):	Print("->")
			
					;Hintergrund leeren
					Box(0, 0, 800, 400, RGB(255,255,255))	
	
					StatusBarText		(#Statusleiste, 0, "Test 4: mit Backbuffer, Sinus mit Rauschen")
					StatusBarProgress	(#Statusleiste, 1, 0)
					StatusBarText		(#Statusleiste, 2, "0 Werte/sek")
					StatusBarText		(#Statusleiste, 3, "0 FPS")			
					
					bearbeite_Test	= 1
					Counter_FPS		= 0
					Counter_Messung	= 0
					
					Zeit_Messung 	= ElapsedMilliseconds()
					Zeit_FPS		= ElapsedMilliseconds()
	
				EndIf
				
			
				; FPS berechnen
				If (ElapsedMilliseconds() - Zeit_FPS >= 1000)
					StatusBarProgress	(#Statusleiste, 1, (ElapsedMilliseconds() - Zeit_Messung) / 100)
					StatusBarText		(#Statusleiste, 2, StrU(Counter_FPS) + " Werte/sek")
					StatusBarText		(#Statusleiste, 3, StrU(Counter_FPS / 800) + " FPS")
					Zeit_FPS		= ElapsedMilliseconds()
					Counter_FPS		= 0
				Else
					Counter_FPS 	+ 1
				EndIf
	
				
				If (ElapsedMilliseconds() - Zeit_Messung >= 10000)
					StatusBarProgress	(#Statusleiste, 1, (ElapsedMilliseconds() - Zeit_Messung) / 100)
					StatusBarText		(#Statusleiste, 2, StrU(Counter_Messung / 10) + " Werte/sek")
					StatusBarText		(#Statusleiste, 3, StrU(Counter_Messung / (800*10)) + " FPS")
					Test_4_Werte		= Counter_Messung / 10
					Test_4_FPS			= Counter_Messung / (800*10)
					ConsoleLocate ( 2,10):	ConsoleColor(10, 0):	Print("ok")
					ConsoleLocate (59 - Len(StrU(Test_4_FPS)),10):		ConsoleColor(14, 0):	Print(StrU(Test_4_FPS) + " FPS")
					ConsoleLocate (73 - Len(StrU(Test_4_Werte)),10):	ConsoleColor(14, 0):	Print(StrU(Test_4_Werte) + " W/s")
					aktueller_Test		= 0
					bearbeite_Test		= 0
					
					
				Else
					Counter_Messung + 1
					
					Counter_Sin + 0.007847
					Y_aktueller_Wert = 200 + Sin(Counter_Sin)*10*Random(19,5) 
			
					; Graph plotten
					LineXY(X_aktueller_Wert - 1, 400 - Y_letzer_Wert, X_aktueller_Wert, 400 - Y_aktueller_Wert, RGB(Random(255), Random(255), Random(255)))
					Y_letzer_Wert = Y_aktueller_Wert
					
					; X-Position weiterrücken, wenn der Graph noch nicht voll ist
					If X_aktueller_Wert < 800
						X_aktueller_Wert 	+ 1
					Else	
						X_aktueller_Wert 	= 0
						
						; Graph in die GUI zeichnen
						StopDrawing()													
						SetGadgetState(#Image_Zeichenflaeche, ImageID(#Image_Buffer))	
						StartDrawing(ImageOutput(#Image_Buffer))
				
						;Hintergrund leeren
						Box(0, 0, 800, 400, RGB(Random(255), Random(255), Random(255)))	
					EndIf
				
				EndIf			
	
			EndIf
			
			
			If (aktueller_Test = 0)
				CloseWindow(#GUI)
				Break
			EndIf

			; Programm beenden
			Select WindowEvent()
				
			Case #PB_Event_CloseWindow
				End
				
			EndSelect
			
		ForEver
		
	EndIf

	ConsoleLocate ( 9, 12):	ConsoleColor(10, 0):	Print("Abgeschlossen!   ---Beenden mit Return-Taste---");
	ConsoleColor  ( 0, 0): 	Input()
	
EndIf

Re: enormer performance Einbruch bei PB v5.21

Verfasst: 09.12.2013 02:05
von STARGÅTE
Wie hast du die Ausführungsgeschwindigkeit gemessen?
Oder anders gefragt, wie macht sich dieser Einbruch der Geschwindigkeit bemerkbar?

Re: enormer performance Einbruch bei PB v5.21

Verfasst: 09.12.2013 16:53
von Chimorin
Meinst du einen Einbruch der Framerate?
Außer dem Lösen von Bugs hat sich ja nichts geändert. Erst recht nichts im 3D-Sektor.

Re: enormer performance Einbruch bei PB v5.21

Verfasst: 09.12.2013 17:00
von PMV
PB optimiert nichts wirklich im Sinne dessen, was man als
Compiler-Optimierungen bezeichnen würde. :wink:

Aber die Performance ist bei meinem Projekt von v5.11 auf
v5.21 ohne merkliche Veränderung.

MFG PMV

Re: enormer performance Einbruch bei PB v5.21

Verfasst: 09.12.2013 20:36
von captain_hesse
@SBond
Bisher habe ich den Auslöser noch nicht finden können leider konnte mir auch dein Tool nicht weiterhelfen die Werte sind alle ziemlich gleich aber danke das du dir die Mühe gemacht hast dieses Tool zu schreiben :allright: .

@Stargate
Es gibt zwei Möglichkeiten erstens zählt das Programm mit wie viele Stellungen es pro Sekunde bewertet und zweitens braucht das Programm bei der selben Figurenstellung in Version 5.21 ca. doppelt so lange um ein Matt zu finden als z.B. mit der Version 5.20 oder früher. Bei Möglichkeit eins zeigt es auch an das nur etwa halb so viele Züge berechnet wurden. Ich habe es mit mehreren Diversen Teststellungen versucht immer das gleiche Ergebnis.

@Bananenfreak
Nein es hat nichts mit der Grafik zu tun.


@PMV
Also kann es daran ja schon mal nicht liegen.

@alle
Leider kann ich im Moment keine weiteren Angaben dazu machen höchstens noch dass das Programm ohne Kommazahlen arbeitet also nur ganze Zahlen verwendet und hauptsächlich nur diverse Zahlen durch diverse Arrays und Structuren schiebt und das nach Möglichkeit so schnell wie es nur geht. Irgendwo muss es wohl in PB 5.21 eine Veränderung gegeben haben die den Geschwindigkeitsunterschied bewirkt. Wenn man irgendwo nachlesen könnte was genau alles in v5.21 geändert wurde, hätte man vielleicht einen Anhaltspunkt aber so weiß ich derzeit garnicht mal genau wonach ich suchen soll.

Re: enormer performance Einbruch bei PB v5.21

Verfasst: 09.12.2013 22:04
von STARGÅTE
Ich weiß natürlich nicht genau, was für Berechnungen du machst, aber es gab bei einigen Versionen hin und wieder Probleme mit Rechenoperationen in Verbindung mit Typenkonversion.
Es kann also durchaus sein, dass mit PB 5.21 einer dieser Bugs behoben wurde, mit dem Resultat, dass hier und da einige ASM-Zeilen hinzu kamen, was nun den Code etwas langsammer macht.

Beispiele für diese Probleme waren vorallem Doubles und Quads

Re: enormer performance Einbruch bei PB v5.21

Verfasst: 12.12.2013 00:26
von captain_hesse
STARGÅTE hat geschrieben: ... was nun den Code etwas langsammer macht.
Na ja wenn es nur ETWAS langsamer wäre hätte ich ja nix gesagt aber nur noch halb so schnell, ist schon ganz schön krass, das wirft mich ja wieder um Jahre zurück da bin ich geschwindigkeitstechnisch wieder auf dem stand wie vor 2-3 Jahren. Das ist für mich nicht akzeptabel da werde ich wohl oder übel vorerst mal bei Version 5.20 bleiben müssen vielleicht ändert sich das ja in den nächsten PB-Versionen wieder. In der Zwischenzeit werde ich das Programm mal von Grund auf neu überarbeiten und wenn ich herausfinden sollte was für den geschwindigkeitsunterschied verantwortlich ist werde ich es hier Posten. Bis dahin aber erst mal danke für eure Hilfe.

Re: enormer performance Einbruch bei PB v5.21

Verfasst: 12.12.2013 01:11
von STARGÅTE
Aber wenn du so viel Wert auf Geschwindigkeit legst, dann würde ich den Berechnugs-Kern sowieso direkt in ASM schreiben.
Allein das würde mit sicherheit noch mal 3 bis 5 mal schneller werden.
captain_hesse hat geschrieben:Na ja wenn es nur ETWAS langsamer wäre hätte ich ja nix gesagt aber nur noch halb so schnell, ist schon ganz schön krass
Naja, wenn in einer Schleife nur ein PB-Befehl stand, der früher 2 ASM-Zeichen erzeugt hat und nun (wegen kA was) 4 Zeilen erzeugt, wäre das schon mal an dieser Stelle doppelt so viel zeit (in etwa).

[Leicht OT]
Die kompilierte PB-Code ist nicht optimiert, was in den meisten Fällen auch nicht schlimm ist, dafür ist der Kompiler schon schnell in der Ausführung.
Ich selbst, konnte meinen Augen kaum glauben, als ich mein Include für Vektoren mit ASM und SSE optimiert habe, und die Berechnungen 10 mal schneller waren. (dafür ist die Include datei nun 10 mal länger ^^)
[/OT]

Du kannst ja mal deinen Kern hier posten, muss ja in igrndeiner Schleife sein, die zimlich tief verschachtelt ist, damit es diese Auswirkungen hat.
Außdem kannst du ja mal den erzeugten ASM Code von 5.20 und 5.21 vergleichen.

Re: enormer performance Einbruch bei PB v5.21

Verfasst: 12.12.2013 12:40
von PMV
Da mich auch ziemlich interessiert, was den Unterschied aus macht:
Es ist nun wirklich kein Akt, die entsprechende Stelle raus zu finden.
Schreib dir ne kleine Include die die Zeit zwischen zwei Aufrufen misst.
Das Ergebnis schreibst jeweils in eine LinkedListElement und am Ende
schreibst alle Einträge in eine Datei. Das machst mit beiden PB Versionen
und dann kannst ziemlich gut vergleichen. :wink:

MFG PMV