Geschwindigkeit

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Geschwindigkeit

Beitrag von Danilo »

lite hat geschrieben:Hätte wieder ein kleines Problem mit der Geschwindigkeit.
Meine Aufgabenstellung ist, ich möchte Strings zu einem String zusammen zu fügen.

Beispiel in PB:

Code: Alles auswählen

#Size = 50000
a$=""
Time = ElapsedMilliseconds()
For n = 1 To #Size
    a$+"w"
Next
Time1 = ElapsedMilliseconds()-Time
MessageRequester(Str(time1),a$)
Dieses Beispiel in PureBasic benötigt 13000 ms.
Dieses Beispiel in PureBasic benötigt 0 ms.

Code: Alles auswählen

DisableDebugger

#Size = 50000
a$=""
Time = ElapsedMilliseconds()

    A$ = Space(#Size)
    FillMemory(@a$,#Size*SizeOf(Character),'w',#PB_Character)

Time1 = ElapsedMilliseconds()-Time

MessageRequester(Str(time1),a$)
MessageRequester(Str(time1),Left(a$,1000))
Für Strings variabler Länge ist es gut einen Puffer anzulegen und dann alle Strings mit PokeS oder CopyMemory / CopyMemoryString
hineinzuschreiben.
Man kann aber spezieller optimieren, wenn man genauer weiss um was es in dem Spezialfall geht.
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: Geschwindigkeit

Beitrag von helpy »

Siehe auch: StringBuilder
Windows 10
PB Last Final / (Sometimes testing Beta versions)
lite
Beiträge: 122
Registriert: 27.08.2012 21:08

Re: Geschwindigkeit

Beitrag von lite »

Hallo

Danke für euere Hilfe.

@Danilo
Dein Beispiel ist nicht das, wonach ich gesucht hab.

Code: Alles auswählen

a$+"w"
Das "w" stand nur Symbolisch für einen weiteren String. Der String kann einen Länge von 1-(fast) unendlich haben.

@helpy
Das mit dem "Stringbuilder" muss ich mir mal anschauen.
Wen das funktioniert, gehört so ein Stringbuilder nicht nativ in die PureBasic Sprache ?

Grüße
Lite
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Geschwindigkeit

Beitrag von cxAlex »

lite hat geschrieben: @helpy
Das mit dem "Stringbuilder" muss ich mir mal anschauen.
Wen das funktioniert, gehört so ein Stringbuilder nicht nativ in die PureBasic Sprache ?
Nein, da der StringBuilder hier eben wieder nur einen Vorteil in eben genau diesem einem Fall bringt (Immer wieder vergrößern eines Strings). Eventuell könnte man es in die PB - String Library aufnehmen, aber auch das bezweifle ich. So genial PB auch ist hinsichtlich des Funktionsumfangs, Vorschläge zur Geschwindigkeitsoptimierung werden eigentlich immer abgelehnt wenn nicht ganz ignoriert, weshalb ich für Perfomance - Kritische Bereiche nun C einsetzte, so gerne ich PB verwenden würde, wenns nur um 5,10% Geschwindigkeitsunterschied gehen würde, aber teilweise klafft da ein Unterschied des 10 bis 20 Fachen :cry:
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Re: Geschwindigkeit

Beitrag von Kukulkan »

This was of of the first things to learn during development on C64 and others :-)

String concatenation is a memory copy job that needs time. For every "w" added you need to allocate a new memory area, copy everything to that area, copy "w" to the end and release the previous one. This takes more time the longer the result gets. In order to eliminate this issue, simply use some concatenation buffer. The version of Danilo is even more efficient but this one does not need any further experience to understand and apply.

Code: Alles auswählen

#Size = 50000
; BAD APPROACH
a$=""
Time = ElapsedMilliseconds()
For n = 1 To #Size
    a$+"w"
Next
Time1 = ElapsedMilliseconds()-Time

; BETTER APPROACH
a$=""
dummy$=""
Time = ElapsedMilliseconds()
For n = 1 To #Size
  dummy$+"w"
  If Len(dummy$) > 500: a$+dummy$: dummy$="": EndIf
Next
a$+dummy$
Time2 = ElapsedMilliseconds()-Time

MessageRequester(Str(time1)+"ms","Initial challenge")
MessageRequester(Str(time2)+"ms","Simply enhanced version")
Initial challenge: 7363ms
Enhanced: 110ms (1.5% of the initial time)

The "500" should get optimized regarding the average length of the "w" values. Simply play a litte with the values.

Kukulkan
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: Geschwindigkeit

Beitrag von 7x7 »

Schreib doch in Schwäbisch, wenn du kein Deutsch kannst :D
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
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 »

Ich bin mehr für Suaheli, auch wenn das in Europa nicht so geläufig ist.
Kukulkan hat geschrieben:Kamba concatenation ni nakala ya kumbukumbu ya kazi ambayo inahitaji muda. Kwa kila 'w' aliongeza unahitaji kutenga mpya kumbukumbu eneo hilo, nakala kila kitu kwa eneo hilo, nakala 'w' hadi mwisho na kutolewa moja uliopita. Hii inachukua muda zaidi tena matokeo anapata. Ili kuondokana na suala hili, tu kutumia baadhi buffer concatenation. toleo la Danilo ni hata ufanisi zaidi lakini hii haina haja yoyote ya uzoefu zaidi wa kuelewa na kuomba.
Jetzt sollte es jeder verstehen können :mrgreen:
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
Benutzeravatar
Kukulkan
Beiträge: 1066
Registriert: 09.09.2004 07:07
Wohnort: Süddeutschland
Kontaktdaten:

Re: Geschwindigkeit

Beitrag von Kukulkan »

7x7 hat geschrieben:Schreib doch in Schwäbisch, wenn du kein Deutsch kannst
ts-soft hat geschrieben:Ich bin mehr für Suaheli, auch wenn das in Europa nicht so geläufig ist.
Jaja :lol: ich habs erst gar nicht bemerkt. Bin meist auf englischen Forum und Seiten unterwegs und da hat die Gewohnheit zugeschlagen. :|
Beim nächsten Mal versuch ich's in Suaheli :wink:
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: Geschwindigkeit

Beitrag von helpy »

Kukulkan hat geschrieben:
7x7 hat geschrieben:Schreib doch in Schwäbisch, wenn du kein Deutsch kannst
ts-soft hat geschrieben:Ich bin mehr für Suaheli, auch wenn das in Europa nicht so geläufig ist.
Jaja :lol: ich habs erst gar nicht bemerkt. Bin meist auf englischen Forum und Seiten unterwegs und da hat die Gewohnheit zugeschlagen. :|
Beim nächsten Mal versuch ich's in Suaheli :wink:
;-) Aaah ;-) Ich bin nicht der einzige, dem so etwas passiert.
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Geschwindigkeit

Beitrag von bobobo »

否則,您不會有任何問題,對不對?
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Antworten