PureBasic Forum
http://forums.purebasic.com/english/

Fast string
http://forums.purebasic.com/english/viewtopic.php?f=3&t=58892
Page 4 of 4

Author:  BarryG [ Wed May 29, 2019 8:32 am ]
Post subject:  Re: Fast string

+1 for faster native strings.

Author:  Cyllceaux [ Wed May 29, 2019 6:47 pm ]
Post subject:  Re: Fast string

@forumuser

I don't know what you mean… do you have an example?

Btw. These are my string-tools at the moment.

Code:
EnableExplicit

Procedure StringAppend(*sb,string.s)
   If string=""
      ProcedureReturn *sb
   EndIf
   Protected size,*Offset
   If *sb
      size=MemorySize(*sb)
      *Offset=size
   EndIf
   size+StringByteLength(string)
   *sb=ReAllocateMemory(*sb,size,#PB_Memory_NoClear)
   PokeS(*sb+*offset,string,-1,#PB_String_NoZero)
   ProcedureReturn *sb
EndProcedure

Procedure AppendString(*sb,string.s)
   ProcedureReturn StringAppend(*sb,string)
EndProcedure

Procedure.s SBToString(*sb)
   If *sb
      ProcedureReturn PeekS(*sb,MemorySize(*sb)/SizeOf(Character),#PB_Unicode)
   Else
      ProcedureReturn ""
   EndIf
EndProcedure

Macro SB2String(n)
   SBToString(n)
EndMacro

Procedure SBClear(*sb)
   If *sb
      FreeMemory(*sb)
   EndIf
   *sb=0
EndProcedure

Macro SBFree(n)
   SBClear(n)
EndMacro

ImportC ""
   wcsstr.i(*str1, *str2)
   _wcslwr.i(*cs)
   wcslen.l(*cs)
EndImport

Procedure FastStringSplit(sString.s, sDelimiters.s, Array StringArray.i(1), Casesense = 1) 
   
   Protected String = @sString
   Protected Delimiters = @sDelimiters
   
   Protected StringSize = wcslen(String) * 2
   Protected DelimitersSize = wcslen(Delimiters) * 2
   
   Protected aString = AllocateMemory(StringSize + 2):CopyMemory(String,aString,StringSize)
   If Not aString:ProcedureReturn 0:EndIf
   
   If Casesense = 0
      _wcslwr(String)
      _wcslwr(Delimiters)
   EndIf
   
   Protected String2 = String
   Protected ElementStart ,ElementSize
   
   Protected aItem
   Repeat   
      
      String2 = wcsstr(String2,Delimiters)
      If String2 = 0
         ElementSize = StringSize - ElementStart
      Else
         ElementSize = String2 - (String + ElementStart)
      EndIf
      
      If ArraySize(StringArray()) < aItem : ReDim StringArray(aItem +99):EndIf
      
      StringArray(aItem) = aString + ElementStart
      aItem + 1
      
      PokeW(aString + ElementStart + ElementSize, 0)
      
      ElementStart + ElementSize + DelimitersSize
      
      String2 + DelimitersSize
      
   Until String2 = DelimitersSize
   
   If ElementSize = StringSize
      FreeMemory(aString)
      If ArraySize(StringArray())=1
         StringArray(0)=@sString
      EndIf
      ProcedureReturn 0
   EndIf
   
   ReDim StringArray(aItem-1)
   
   If ArraySize(StringArray())=0
      StringArray(0)=@sString
   EndIf
   ProcedureReturn aString
EndProcedure

Procedure.s makeParsebleNumber(value.s,post.s="",prefix.s="")
   Protected result.s=Trim(ReplaceString(Value,#DQUOTE$,""))
   If post<>""
      result=ReplaceString(result,post,"")
   EndIf
   If prefix<>""
      result=ReplaceString(result,prefix,"")
   EndIf
   Protected pp=FindString(result,".")
   Protected kk=FindString(result,",")
   If pp<kk
      result=ReplaceString(result,".","")
      result=ReplaceString(result,",",".")
   Else
      result=ReplaceString(result,",","")
   EndIf
   ProcedureReturn Trim(result)
EndProcedure


Procedure.d extValD(value.s,post.s="",prefix.s="")
   Protected result.s=makeParsebleNumber(value)
   ProcedureReturn ValD(Trim(result))
EndProcedure

Procedure.f extValF(value.s,post.s="",prefix.s="")
   Protected result.s=makeParsebleNumber(value)
   ProcedureReturn ValF(Trim(result))
EndProcedure

Procedure.b isLong(value.s)
   ProcedureReturn Bool(Str(Val(value))=value)
EndProcedure

Author:  DoubleDutch [ Wed Jun 05, 2019 8:42 pm ]
Post subject:  Re: Fast string

+1

Author:  davido [ Wed Jun 05, 2019 8:52 pm ]
Post subject:  Re: Fast string

+1

Author:  chi [ Wed Aug 14, 2019 4:31 pm ]
Post subject:  Re: Fast string

+1

Author:  Mijikai [ Wed Aug 14, 2019 5:15 pm ]
Post subject:  Re: Fast string

+1

Author:  Tenaja [ Thu Aug 15, 2019 5:07 pm ]
Post subject:  Re: Fast string

+1

Author:  Rinzwind [ Fri Aug 16, 2019 4:40 am ]
Post subject:  Re: Fast string

Possibly take a look at http://bstring.sourceforge.net (or fork https://github.com/msteinert/bstring) for inspiration. Better String Library (bstrlib) for c.

Or https://github.com/antirez/sds . Simple Dynamic Strings (SDS), a c-string compatible optimized library by putting a header with length info in front of the actual c string which makes it an easy insert into PB I guess?

Author:  Tenaja [ Fri Aug 16, 2019 3:00 pm ]
Post subject:  Re: Fast string

I do not work with very large strings, but mostly under 64 characters. It would be nice if we could set the minimum length for the initial allocation, so there would typically be no additional allocations.

I'm also considering using ropes, skeptically. This might be useful, especially for those of you using very long strings. Basically, they are a List of shorter strings treated as a single string. Ideal for long sets, since it can eliminate your large repetitive allocations. Likely overkill for me though...

Author:  zikitrake [ Mon Nov 11, 2019 8:59 pm ]
Post subject:  Re: Fast string

:lol: I thought I'd be alone in this fight.

+1 to have a faster native option of string concatenation

Page 4 of 4 All times are UTC + 1 hour
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/