Aktuelle Zeit: 18.12.2018 20:47

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: StringField()-Alternative
BeitragVerfasst: 10.07.2017 11:38 
Offline
Benutzeravatar

Registriert: 22.05.2013 20:35
Wohnort: nahe Wolfsburg
Hallo Leute,

mir ist gerade aufgefallen, dass StringField nicht gerade effizient arbeitet. Bei Verdoppelung der Einträge in einem String, halbiert sich die Anzahl der geparsten Einträge pro Sekunde. Somit vervierfacht sich die Zeit, in dem ein String (mit doppelt so vielen Einträgen) geparst wird.

Code:
myString.s = ""
entries.i = 16000

For x = 1 To entries
   myString + Str(x) + #CRLF$
Next

T1 = ElapsedMilliseconds()
For index = 1 To entries
   selLine.s = StringField(myString, index, #CRLF$)
Next
T2 = ElapsedMilliseconds()

Debug "Dauer: " + Str(T2-T1) + " ms"
Debug "Eintäge: " + Str(entries)
Debug "Einträge pro Sek: " + StrD(entries/((T2-T1)/1000),2)

; Eintäge: 1000  - Einträge pro Sek: 27777.78
; Eintäge: 2000  - Einträge pro Sek: 14492.75
; Eintäge: 4000  - Einträge pro Sek: 7272.73
; Eintäge: 8000  - Einträge pro Sek: 3576.22
; Eintäge: 16000 - Einträge pro Sek: 1780.75



Bei Strings mit vielen Einträgen (>10K) wird das sehr spürbar. Gibt es da eine schnellere Alternative oder muss ich mich irgendwie über Speicheroperatoren durch den String hangeln? Letzteres würde ich lieber meiden, da ich wahrscheinlich ASCI/Unicode-Unterscheidungen machen müsste.

viele Grüße,
SBond

_________________
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: StringField()-Alternative
BeitragVerfasst: 10.07.2017 11:58 
Offline
Benutzeravatar

Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9
das hier ist ein wenig schneller:
Code:
Define myString.s = ""
Define entries = 16000

For x = 1 To entries
  myString + Str(x) + #CRLF$
Next

Define CrLf.s = #CRLF$
Define SelLine.s
Define Value.s

T1 = ElapsedMilliseconds()

! $.each( v_mystring.split(v_crlf) , function( index, v_value ) {
SelLine = Value
! });

T2 = ElapsedMilliseconds()

Debug "Dauer: " + Str(T2-T1) + " ms"
Debug "Einträge: " + Str(entries)
Debug "Einträge pro Sek: " + StrD(entries/((T2-T1)/1000),2)


Grüße ... Peter

_________________
ƃᴉɹǝᴉʍɥɔs ʇsᴉ ɥɔɐɟuᴉǝ


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: StringField()-Alternative
BeitragVerfasst: 10.07.2017 12:02 
Online
Ein Admin
Benutzeravatar

Registriert: 29.08.2004 20:20
Wohnort: Saarbrücken
Das hat natürlich eine quadratische Laufzeit, weil jedes mal durch den kompletten String gelaufen wird um dann genau den Eintrag mit dem richtigen Index heraus zu nehmen.
Wenn man sowieso alle Einträge aus dem String braucht, splittet man ihn lieber direkt und packt ihn in einer Array oder eine LinkedList.

Ich habe da mal schnell etwas zusammen gebastelt, das alle Einträge eines so geteilten Strings in ein Array entpackt. Die Array-Größe wird dabei automatisch in O(1) angepasst.
Code:
EnableExplicit

Procedure explode(in.s, Array out.s(1), sep.s = ",")
   Protected *i.Character = @in, *s.Character = @sep, *start = *i
   Protected index.i = 0, element.s
   
   Repeat
      If *i\c = *s\c Or *i\c = 0
         *s + SizeOf(Character)
         If *s\c = 0 Or *i\c = 0
            element =  PeekS(*start, ((*i - *start) - (*s - @sep)) / SizeOf(Character) + 1)
            If ArraySize(out()) < index
               ReDim out((ArraySize(out()) + 1) * 2 - 1)
            EndIf
            out(index) = element
            If *i\c = 0
               Break
            EndIf
            index + 1
            *start = *i + SizeOf(Character)
            *s = @sep
         EndIf
      EndIf
      *i + SizeOf(Character)
   ForEver
   
   ReDim out(index)
   
   ProcedureReturn index + 1
EndProcedure

Dim out.s(0)
Define found.i
found = explode(", hi, wie, geht,, es dir?, so", out(), ", ")

Debug "" + found + " Element gefunden."

Define i.i
For i = 0 To ArraySize(out())
   Debug "out(" + i + ") = '" + out(i) + "'"
Next


Edit: Ach Mist, das war ja schon wieder für Spiderbasic. :lol:

_________________
Freakscorner.de - Der Bastelkeller | Neustes Video: Neje DK - 1 Watt Laser Engraver
Ubuntu Gnome 18.04.1 LTS x64, PureBasic 5.60 x64 (außerdem 4.41, 4.50, 4.61, 5.00, 5.10, 5.11, 5.21, 5.22, 5.30, 5.31, 5.40, 5.50)
"Die deutsche Rechtschreibung ist Freeware, du darfst sie kostenlos nutzen – Aber sie ist nicht Open Source, d. h. du darfst sie nicht verändern oder in veränderter Form veröffentlichen."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: StringField()-Alternative
BeitragVerfasst: 10.07.2017 12:55 
Offline
Benutzeravatar

Registriert: 22.05.2013 20:35
Wohnort: nahe Wolfsburg
Kiffi hat geschrieben:
das hier ist ein wenig schneller


:shock: naja "ein wenig"?! Das geht ab wie ein Zäpfchen :mrgreen:
Ich sollte wohl mal ein Crash-Kurs in JS machen :lol:

vielen Dank euch beiden :mrgreen:

viele Grüße,
Martin

_________________
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: StringField()-Alternative
BeitragVerfasst: 10.07.2017 13:24 
Offline
Benutzeravatar

Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9
SBond hat geschrieben:
Das geht ab wie ein Zäpfchen

es geht noch schneller (mit forEach):

Code:
myString.s = ""
entries.i = 1000000

For x = 1 To entries
  myString + Str(x) + #CRLF$
Next

Define CrLf.s = #CRLF$
Define SelLine.s
Define Value.s

T1 = ElapsedMilliseconds()

! $.each( v_mystring.split(v_crlf) , function( index, v_value ) {
SelLine = Value
! });

T2 = ElapsedMilliseconds()

Debug "$.each()"
Debug "Dauer: " + Str(T2-T1) + " ms"
Debug "Einträge: " + Str(entries)
Debug "Einträge pro Sek: " + StrD(entries/((T2-T1)/1000),2)
Debug "------------------"

T1 = ElapsedMilliseconds()

! v_mystring.split(v_crlf).forEach( function( v_value, index ) {
SelLine = Value
! });

T2 = ElapsedMilliseconds()

Debug "().forEach"
Debug "Dauer: " + Str(T2-T1) + " ms"
Debug "Einträge: " + Str(entries)
Debug "Einträge pro Sek: " + StrD(entries/((T2-T1)/1000),2)
Debug "------------------"


Grüße ... Peter

_________________
ƃᴉɹǝᴉʍɥɔs ʇsᴉ ɥɔɐɟuᴉǝ


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: StringField()-Alternative
BeitragVerfasst: 10.07.2017 14:35 
Offline
Benutzeravatar

Registriert: 22.05.2013 20:35
Wohnort: nahe Wolfsburg
oh ha <)
Ja da bin ich wunschlos glücklich :)


Tja dann ist heute abend wohl Kalsarikännit angesagt :mrgreen:

viele Grüße,
Martin

_________________
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye