StringAccumulator component
At some point, every VB programmer has written a loop something like
this:
Dim i As
String, inl As String
While Not EOF(inf)
Line Input #inf, inl
' {... do stuff to inl ...}
i = i + inl
Wend
Debug.Print i
You know, the old "build a string out of pieces" loop.
While we all end up performing this task, the truth is, it's a really
inefficient way to build strings. Every time the "i = i + inl "
code executes, VB will allocate a new string, copy the current contents of
i into it, copy the contents of inl into it,
assign it to i , and deallocate the old string that contained
i 's former contents. If you are building large strings from
many fragments this kind of loop can completely devastate your application's
performance.
Since I often found myself writing this kind of loop when processing HTML
files, I added a component to the HtmlZap library designed to address the
performance problems caused by building strings from fragments. That
component is called StringAccumulator.
The StringAccumulator component is very simple. All it does is allow you
to build a string by appending fragments, then retrieve the accumulated
string.
However, using the StringAccumulator component is far faster than the
technique shown in the above example. Instead of doing a lot of copying and
memory management, the StringAccumulator component builds a linked list of
the strings you append. It only builds the complete string when you retrieve
the component's String property, and even then it allocates
only one string (big enough to contain all the fragments) and copies all the
fragments into it.
Rewriting the above code fragment using the StringAccumulator component
would result in something like this:
Dim inl
As String
Dim sa As
New HTMLZAPLib.StringAccumulator
While Not EOF(inf)
Line Input #inf, inl
' {... do stuff to inl ...}
sa.Add inl
Wend
Debug.Print sa.String
Building strings with StringAccumulator is so efficient that I often
process entire HTML files by opening the file, running it through HtmlZap to
parse the tags, adding the modified tags and text to a StringAccumulator
object, and then writing the contents of the StringAccumulator back out to
disk. This saves the whole "rename the file to .BAK , open it,
write to original name, and delete .BAK file" cycle.
StringAccumulator Properties and Methods
 |
|
 |
For the purposes of the sample code in this document, the object
name "SA" refers to an instance of the StringAccumulator control. |
 |
StringAccumulator properties and methods are only useful at
runtime. |
Method Add
Adds string to the StringAccumulator's contents.
Method AddCR
- Usage:
object.AddCR string
Adds string plus a carriage-return/linefeed pair to the
StringAccumulator's contents.
Property IsEmpty
This boolean value is True when the StringAccumulator is empty.
Property Length
Retrieves the current length of the StringAccumulator's contents.
Method Reset
Empties the StringAccumulator.
Property String
- String
- Read-write. Usage: string = object.String
Retrieves or sets the StringAccumulator's current contents. Typically
this property is used to retrieve the string built by calling the Add
and AddCR methods, though it can also be used to initialize the
object to a specific string.
Last revised: 30 December 2001
|