Seite 6 von 7
Re: Geschwindigkeit
Verfasst: 11.03.2013 08:25
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.
Re: Geschwindigkeit
Verfasst: 11.03.2013 09:18
von helpy
Re: Geschwindigkeit
Verfasst: 11.03.2013 10:58
von lite
Hallo
Danke für euere Hilfe.
@Danilo
Dein Beispiel ist nicht das, wonach ich gesucht hab.
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
Re: Geschwindigkeit
Verfasst: 11.03.2013 12:35
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

Re: Geschwindigkeit
Verfasst: 12.03.2013 18:51
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
Re: Geschwindigkeit
Verfasst: 12.03.2013 19:37
von 7x7
Schreib doch in Schwäbisch, wenn du kein Deutsch kannst

Re: Geschwindigkeit
Verfasst: 12.03.2013 19:45
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

Re: Geschwindigkeit
Verfasst: 13.03.2013 08:30
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

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

Re: Geschwindigkeit
Verfasst: 13.03.2013 09:54
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

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


Aaah

Ich bin nicht der einzige, dem so etwas passiert.
Re: Geschwindigkeit
Verfasst: 14.03.2013 22:05
von bobobo
否則,您不會有任何問題,對不對?