[fpc-devel] Performance of string handling in trunk

Michael Schnell mschnell at lumino.de
Wed Jun 26 10:16:03 CEST 2013

On 06/25/2013 01:19 PM, Hans-Peter Diettrich wrote:
> This is not the case :-(
> A variable can not force a conversion, when a RawByteString is 
> assigned to it :-(
I suppose you decently tested this with the newest version of Delphi XE. 
I can't comment, as I dont have DXE. :-( .

But you and the docs state, that RawByteString is not intended to hold a 
string of unencoded raw bytes that never are supposed to represent 
printable characters, but despite of its name it is (e.g.) supposed to 
be used as formal parameter, a String holding printable characters with 
a known encoding is to be assigned to. Thus I in fact fail to see the 
sense of it existence, if really the information about the encoding type 
of the string, assigned (without conversion) to it, is lost.

OTOH it seems to be easily to understand and to implement that/if the 
dynamic EncodingTyp tag  (that according top the docs exists in the 
string management record together with the ContentPointer, the 
StringLength and ReferenceCounter) is updated with that information 
during the assignment (in the same way as ContentPointer and 
StringLength). This would allow for decent use of such a type variant 
and IMHO should be the way to go for fpc. This would be perfectly 
compatible, even if Delphi does not allow for such usage of the 
RawByteString Type. It would not slow down anything if you don't use 
that feature, and IMHO the performance hit would be close to zero (and 
still rather compatible) if implementing stuff like TStringList using 
this feature.

  - Such a TStringList would be able to work with any String type 
without ever forcing an auto-conversion (unless you check out a string 
to a variable of a different (static) type).
  - Lazarus could use such a string type as it's interface to the user 
code. This would allow for using greatly the same code for multiple 
archs, independent of the user code. IMHO, the performance hit for this 
should be small, as these interface functions mostly are not used in 
very long close loops.


More information about the fpc-devel mailing list