Geschwindigkeit

Anfängerfragen zum Programmieren mit PureBasic.
lite
Beiträge: 122
Registriert: 27.08.2012 21:08

Geschwindigkeit

Beitrag von lite »

Hallo

Beschäftige mich seit einigen Monaten mit PureBasic. Die Grundidee, einem Basic-Syntax in Assembler umzuwandeln finde ich genial. Deshalb hab ich mich entschlossen, diese Programmiersprache zu kaufen.
Nach den ersten Anfangsschwierigkeiten läuft es sehr gut mit den ersten Programmen.
Was mir aufgefallen ist, PureBasic ist viel zu langsam.
Gleiche operationen in einer anderen Sprache wie z.B. Autoit sind wesentlich schneller.
Nach meiner Messung teilweise um die 20-30%.
Jetzt wird Autoit nicht umgewandelt, sondern nur das Script in die .Exe gepackt, ist das schon verwunderlich.
Das enttäuscht schon sehr. Jetzt möcht ich nicht gleich Aufgeben, weil die Idee von PureBasic super ist.

In meinen Prg verarbeite ich 1 Arrayfeld und Strings, zwischendurch werden noch Dateien kopiert.

Jetzt meine Frage, Was kann man beachten, damit das Prg schneller wird ?

Grüße

Lite
c4s
Beiträge: 1235
Registriert: 19.09.2007 22:18

Re: Geschwindigkeit

Beitrag von c4s »

War der Debugger an? Hast du schlecht (d.h. der Performance schadend) programmiert? Hat eventuell ein Antiviren-Tool PureBasic blockiert?
Poste mal deinen Code, den du zum Vergleichen verwendet hast...
"Menschenskinder, das Niveau dieses Forums singt schon wieder!" — GronkhLP ||| "ich hogffe ihr könnt den fehle endecken" — Marvin133 ||| "Ideoten gibts ..." — computerfreak ||| "Jup, danke. Gruss" — funkheld
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Geschwindigkeit

Beitrag von STARGÅTE »

Bild
Warte c4s, ich sehe ich gleich ^^
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
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Re: Geschwindigkeit

Beitrag von DrShrek »

Vieleicht hat lite aber einfach nur recht.
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Geschwindigkeit

Beitrag von NicTheQuick »

Ein Programm ist immer so schnell wie man es programmiert. Man kann auch in ASM, C oder C++ arschlangsame Programme schreiben.
Vermutlich kennst du noch nicht alle Feinheiten von Purebasic und schimpfst unbegründet darüber. Deshalb wäre ein Beispielcode von dir hilfreich, der uns zeigt, wie du das Problem gelöst hast.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Geschwindigkeit

Beitrag von ts-soft »

DrShrek hat geschrieben:Vieleicht hat lite aber einfach nur recht.
Du solltest aber abschecken können, das PB ca. 10 - 20x schneller als AutoIt ist und das Problem
woanders liegt.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
lite
Beiträge: 122
Registriert: 27.08.2012 21:08

Re: Geschwindigkeit

Beitrag von lite »

Hallo

Zuvor ein paar Infos. Ja, der Debugger ist aus.
Es ist ein Programm, das viele Textdateien liest (ca. 200 Stück) mit ca 400-1000 Lines pro Datei.
Jede Datei wird zeilenweise gelesen, bis die Section erreicht wurde.
Ab den Zeilpunkt werden die Zeilen analysiert und weiterverarbeit.

Das Programm muss Ansi und Unicode unterstützen.Den ganzen Quellcode zu posten wäre ein wenig umfangreich.
Sind mom. 4500 Lines.

Hier ein Auszug:

Purebasic:

Code: Alles auswählen


Procedure.s StringStrip(str$)
  ; stringstripleft (unicode)
  res$=""
  For x =0 To Len(str$)*2 Step 2
    uni=PeekU(@str$+x)
    If uni>32
      res$=Mid(str$,1+(x/2))
      Break
    EndIf
  Next
  ; stringstripright (unicode)
  str$=""
  res$= ReverseString(res$)
  For x =0 To Len(res$)*2 Step 2
    uni=PeekU(@res$+x)
    If uni>32
      str$=Mid(res$,1+(x/2))
      Break
    EndIf   
  Next
  str$= ReverseString(str$)
  ProcedureReturn str$
EndProcedure

Procedure _readsection(File$,Section$)
  
  Section$=LCase(Section$)
  File = OpenFile(1, File$)
  If File
    Format.l = ReadStringFormat(1)
    If Format = #PB_Ascii Or Format = #PB_UTF8 Or Format = #PB_Unicode
      length = Lof(1)
      If length
       *mem= AllocateMemory(length)
       ReadData(1, *mem, length)
      
       TxtFile$=PeekS(*mem,length,Format)
       FreeMemory(*mem) 
       CloseFile(1)
            
       Sectfound=0
       lins$=""      
       For x=1 To CountString(TxtFile$,#LF$)+1
        lin$= StringField(TxtFile$,x,#LF$)
        Line$ = StringStrip(lin$)  ; " " und #tab entfernen

        If Left(Line$, 1) = "["
         If Sectfound=1: Break: EndIf
         Sectfound=0
        EndIf
      
        If Sectfound=1
         If Line$="": Continue: EndIf ; leere Zeile
         If Left(Line$,2) = "//": Continue: EndIf
			   If Left(Line$,2) = "##": Continue: EndIf
			  			  
			   If Right(Line$,2)=",\"
				  lins$+RTrim(Line$,"\")
				  Continue
			   EndIf
			   lins$+Line$
		
			  
 			   Debug(lins$)
			   lins$=""
			  EndIf
        If LCase(Line$) = "["+Section$+"]": Sectfound=1: EndIf
       Next
      EndIf
    EndIf
  EndIf
EndProcedure
Autoit

Code: Alles auswählen

Func _readsection($sFileName,$sSection)
	local $x

	$sLine = StringSplit(FileRead($sFileName), @LF)
	$sfound_sect =0
	$slins=""	; temp var für line
	for $x=1 to $sLine[0]
		$sLine[$x]= StringStripWS($sLine[$x],3)
		if $sLine[$x]="" then ContinueLoop ; leere Zeile
		if stringleft($sline[$x],1)= "["  then $sfound_sect =0; vielleicht andere liste ? lesen stoppen
		if $sfound_sect=1 then
			
			$sLine[$x]= StringStripWS($sLine[$x],3)
			if stringleft($sLine[$x],2) = "//" then ContinueLoop
			if stringleft($sLine[$x],2) = "##" then ContinueLoop

			if StringRight($sLine[$x],2)=",\" then
				$sLine[$x]=StringTrimRight($sLine[$x],1)
				$slins=$slins&$sLine[$x]
				ContinueLoop
			endif
			$slins=$slins&$sLine[$x]

			consolewrite($slins&crlf)
			$slins=""
			
		endif
		if $sline[$x] ="["&$sSection&"]" then $sfound_sect=1
	next
endfunc
Wie gesagt, wen ich das Programm in beiden Sprachen starte, ist Autoit 30 % schneller.

Bitte bei der Diskussion sachlich bleiben.

Grüße
Lite
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Geschwindigkeit

Beitrag von STARGÅTE »

  • Es ist sehr schlecht, in der For-To-Schleife als End-Bedingung die Funktion CountString(TxtFile$,#LF$) zu nutzen. Der Grund ist der, dass dieser Befehl relativ langsam ist und mit jedem schleifendurchgang erneut ausgeführt wird.
    Besser wäre es hier sowas zu verwenden, da du ja die Variable x nicht brauchst:

    Code: Alles auswählen

    For x=CountString(TxtFile$,#LF$) To 0 Step -1
    So wird dieser Befehl nur einmal ausgeführt.
  • Deine Funktion StringStrip() ist natürlich überhaupt nicht optimiert, das dehen von Strings ist langsam und unnötig.
    Auch dort wieder sind Funktionen in der Schleife, die den Code verlangsammen. Hier wäre es bedeutend einfacher, den String als Pointer zu übergeben und dann in einem Unicode-Array nach betreffenden Zeichen zu suchen und am ende einen gekürzten String zurückzugeben.
Edit: Hier mal meine StringStrip() Variante:

Code: Alles auswählen

Structure CharacterArray
	c.c[0]
EndStructure

Procedure.s StringStrip(*Char.CharacterArray)
	Protected Length.i = MemoryStringLength(*Char)-1
	Protected Index.i = 0
	While *Char\c[Index] <= 32
		Index + 1
	Wend
	While *Char\c[Length] <= 32
		Length - 1
	Wend
	ProcedureReturn PeekS(@*Char\c[Index], Length-Index+1)
EndProcedure


Define String.s = #TAB$+#TAB$+"  Tabs und Leerzeichen"+#TAB$+"  "
MessageRequester("","'"+String+"'"+#LF$+"'"+StringStrip(@String)+"'")
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
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Re: Geschwindigkeit

Beitrag von DrShrek »

Jetzt noch die AutoIt Sourcen optimieren und dann geht "das Rennen" weiter.

Aktuell steht es 1:0 für AutoIt (weil kostenlos)
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
lite
Beiträge: 122
Registriert: 27.08.2012 21:08

Re: Geschwindigkeit

Beitrag von lite »

Hallo

Danke Stargate für die Info.
Deine Vorschläge sind interessant. Hab das gestern getestet. Die Auswirkungen sind im Millisekunden bereich.
Als ich die Funktionen miteinander verglich und in eine For Next Schleife steckte, ca. 100 000 aufgerufen, hab.
Ergab sich ein Unterschied von 570 Ms zu 340 Ms für deine Funktion.
An dem kann es nicht liegen. Wen ich die Einzelnen Funktionen teste, ist PureBasic schneller.
Saß gestern 3 Stunden davor um das Problem zu finden.
Bin echt ratlos. Kann es an der Gui liegen ? Irgendwas bremst.
Benute XP Support und Unicode.
Ich weiss, ist echt schwer, darauf eine Anwort geben zu können.

Grüße
Lite
Antworten