SQLite-StringBuilder
Verfasst: 14.03.2016 17:20
PB ist bekanntermaßen nicht so performant, wenn es darum geht, Zeichenketten zu verknüpfen.
In diesem und im englischen Forum gibt es bereits einige Codes, die Stringverknüpfungen beschleunigen.
Hier mal eine etwas andere Art eines Stringbuilders, welcher SQLite-Funktionalitäten verwendet.
Je höher die Anzahl der Durchläufe (bei ab einer Anzahl > 500) und je länger die zu verknüpfenden Zeichenketten, desto größer ist der Geschwindigkeits-Gewinn.
Wer also ohnehin SQLite in seinem Code verwendet, kann das ja gerne mal ausprobieren. Allen anderen weise ich darauf hin, dass die Größe der EXE durch die Verwendung von SQLite-Befehlen um knapp ein halbes MB anwächst.
Optimierungen, Modularisierungen, etc. könnt Ihr gerne selber durchführen.
Grüße ... Peter
In diesem und im englischen Forum gibt es bereits einige Codes, die Stringverknüpfungen beschleunigen.
Hier mal eine etwas andere Art eines Stringbuilders, welcher SQLite-Funktionalitäten verwendet.
Je höher die Anzahl der Durchläufe (bei ab einer Anzahl > 500) und je länger die zu verknüpfenden Zeichenketten, desto größer ist der Geschwindigkeits-Gewinn.
Code: Alles auswählen
EnableExplicit
Procedure SbInit()
UseSQLiteDatabase()
Protected DB
DB = OpenDatabase(#PB_Any, ":memory:", "", "", #PB_Database_SQLite)
DatabaseUpdate(DB, "Create Table Strings (String TEXT)")
ProcedureReturn DB
EndProcedure
Procedure SbAppend(DB, String.s)
SetDatabaseString(DB, 0, String)
DatabaseUpdate(DB, "Insert Into Strings (String) Values (?)")
EndProcedure
Procedure.s SbToString(DB, Delimiter.s = "")
Protected ReturnValue.s
DatabaseQuery(DB, "Select Group_Concat(String, '" + Delimiter + "') From Strings")
NextDatabaseRow(DB)
ReturnValue = GetDatabaseString(DB, 0)
FinishDatabaseQuery(DB)
ProcedureReturn ReturnValue
EndProcedure
Procedure.s SbClear(DB)
DatabaseUpdate(DB, "Delete From Strings")
EndProcedure
Procedure.s SbExit(DB)
CloseDatabase(DB)
EndProcedure
; Test:
#Anzahl = 5000
Define SB, Counter
Define Z1, Z2, L1
Z1=ElapsedMilliseconds()
SB = SbInit()
For Counter = 1 To #Anzahl
SbAppend(SB, "Hello PureBasic!")
Next
L1 = Len(SbToString(SB))
SbClear(SB)
SbExit(SB)
Z2=ElapsedMilliseconds()
; ------
Define Z3, Z4, L2
Define SBString.s
Z3=ElapsedMilliseconds()
SBString = ""
For Counter = 1 To #Anzahl
SBString + "Hello PureBasic!"
Next
L2 = Len(SBString)
SBString = ""
Z4=ElapsedMilliseconds()
MessageRequester("Result",
"DB: " + Str(Z2-Z1) + " (" + Str(L1) + ")" + #CRLF$ +
"PB: " + Str(Z4-Z3) + " (" + Str(L2) + ")")
Optimierungen, Modularisierungen, etc. könnt Ihr gerne selber durchführen.

Grüße ... Peter