Michael Van Canneyt wrote 20 lines
On Tue, 21 Jun 2005, Marc Santhoff wrote:
> Hi,
>
> in an application of mine occurs a lot of string separation and
> re-concatenation. Since it is using masses of ANSI strings this is some
> performance problem.
>
> The strings get stored and loaded from TStringList's and concatenated
> by simply using '+' and separated with the function copy().
>
> What I'd like to know is: What's are fastest ways of handling ANSI
> strings?
It's hard to say in general; You would have to supply some example code.
if you're doing things like
For I:=X to Y do
S:=S+L[i]; // S string, L list.
Somewhat similar to that:
if (sl[4] '') then
if ((sl[4][1] = '"') AND (sl[4][length(sl[4])] = '"'))
then BaseColor := copy(sl[4],2,length(sl[4])-2) else BaseColor :=
sl[4];
where BaseColor is a field of a class-type object, sl is a TStringList. I have to look for double quotes here and cut them out if necessary.
Sequences like this are heavily used in loading CSV files. This takes rather long on a 'small' cpu (Geode 300MHz).
Show quoted text 17 lines
then
It might be better to do
Len:=0;
For I:=X to Y do
Inc(Len,Length(L[i])); // S string, L list.
SetLength(S,Len);
P:=1;
For I:=X to Y do
begin
T:=L[i];
Len:=Length(T);
Move(T[1],S[P],Len);
inc(P,Len)
end;
This will avoid a lot of calls to uniquestring, get/setlength etc.
Another snippet esecially for concatenation is this:
result := IntToStr(ID) + SEP +
IntToStr(ID_Customer) + SEP +
QT + Treatment + QT + SEP +
DateToStr(Date) + SEP +
QT + BaseColor + QT + SEP +
... and so on for approx. 15 fields
I think I'll try your technique here ...
Show quoted text 9 lines
Also, keep in mind that getting the I-th string from a list is an expensive operation.
So it is better to do
T:=L[i];
S:=Copy(T,X,Length(T)-X);
than to do
S:=Copy(L[i],X,Length(L[i])-X);
The first option will call GetString only once, the second will call it twice.
This will help me, I'm sure. :)
Thank you so far,
Marc