When you are parsing large amounts of data, the way you code string matching can make a huge difference. In one case I needed to find if a string was contained within quotes, here are the test results from quickest to slowest.
The test situation was to find if the last character in the string ‘abcdefghijklmnopqrstuvwxyz’ is ‘z’ and iterated 100000000 times.
First, the most intuitive which most would use. TickCount of 49546.
Right("abcdefghijklmnopqrstuvwxyz", 1) = "z"
Function Right takes in a Variant by default, by succeeding it with a dollar sign it accepts Strings by default. TickCount of 22828, a significant saving.
Right$("abcdefghijklmnopqrstuvwxyz", 1) = "z"
Using the equals sign would be seem the norm, but what if the String Compare function was used. TickCount of 18047.
StrComp(Right$("abcdefghijklmnopqrstuvwxyz", 1), "z", vbBinaryCompare) = 0
What if Mid was used to extract the last character instead of Right. TickCount of 28391.
StrComp(Mid$("abcdefghijklmnopqrstuvwxyz", Len("abcdefghijklmnopqrstuvwxyz"), 1), "z") = 0
Now what if we use the In String function. String length binary is faster than standard String length. TickCount of 14516.
InStrRev("abcdefghijklmnopqrstuvwxyz", "z", -1, vbBinaryCompare) = LenB("abcdefghijklmnopqrstuvwxyz") / 2
Finally, with out String length binary. TickCount of 11312.
InStrRev("abcdefghijklmnopqrstuvwxyz", "z", -1, vbBinaryCompare) = Len("abcdefghijklmnopqrstuvwxyz")
So using In String Reverse is 77% faster.
UPDATE next day: Three that I totally forgot about
In String starting at last character, TickCount 11266.
InStr(Len("abcdefghijklmnopqrstuvwxyz"), "abcdefghijklmnopqrstuvwxyz", "z", vbBinaryCompare) = Len("abcdefghijklmnopqrstuvwxyz")
And In String Binary which is naturally fast. TickCount 6672.
InStrB(LenB("abcdefghijklmnopqrstuvwxyz") - 1, "abcdefghijklmnopqrstuvwxyz", "z", vbBinaryCompare) = LenB("abcdefghijklmnopqrstuvwxyz") - 1
So using In String Binary is 70% faster.
Leave a Reply