RB clear winner in speed test
Brian Yennie
briany at qldlearning.com
Wed Apr 21 04:17:22 EDT 2004
On guard! Another Rev entry!
Notes:
1) I went back to building the mini-index of first letter hints from
words, and caching the index for future searches
2) I took advantage of the caseSensitive property, which noticeably
speeds up offset()
2a) I noted that the position in the full text has to be at least 2x-1
that of the 1 character index
3) I used a quick array to keep track of two-word combos and quickly
eliminate any line which has a non-existent one in it
4) I used lock/unlock screen because the screen was previously being
updated 6 times instead of once (once for each put into a field,
including the timing mechanism).
My benchmarks are:
HARDWARE: iBook 500Mhz - has been benching at pretty close to 50% speed
of Chris' test machine
FIRST RUN (which creates cached index): 130-135 ticks
ADDITIONAL RUNS (with cached index): 58-62 ticks
Cut those in half, and we would have 65-68 ticks on the first round and
29-31 on each additional, which would actually be faster than the RB
bench!
Of course only Chris can tell us how they run on his end =).
##########
local shortFindList, isWord, textDigest, tTime
on mouseUp
local tMatchList, sMS, fn, stList, shortFind, w, w0, c
## if you want to force refresh of index
if (the optionKey is "down") then put empty into textDigest
set cursor to watch
put the milliseconds into sMS
lock screen
put empty into tTime
## use URL syntax for faster file loading
put "./TargetText.txt" into fn
put url ("file:"&fn) into tMatchList
put "./SearchTextList.txt" into fn
put url ("file:"&fn) into stList
put timeit(sMS,"Load Data") into sMS
-- stripping quotes from both sets saves problems with single quotes
-- or with quoted strings being treated as a word
replace quote with empty in stList
put lower(tMatchList) into tLowerMatchList
replace quote with empty in tLowerMatchList
put md5Digest(tMatchList) into tDigest
if (tDigest <> textDigest) then
put empty into shortFindList
repeat for each word w in tLowerMatchList
put char 1 of w into c
put c after shortFindList
put TRUE into isWord[w]
put TRUE into isWord[w0&w]
put w into w0
end repeat
put tDigest into textDigest
end if
set the caseSensitive to TRUE
repeat for each line inLine in stList
put empty into shortFind
put lower(inLine) into inLineLower
put 0 into i
put empty into w0
repeat for each word w in inLineLower
if not isWord[w0&w] then
put empty into shortFind
exit repeat
end if
put char 1 of w after shortFind
put w into w0
end repeat
if (shortFind is empty) then next repeat
put offset(shortFind, shortFindList) into x
if (x > 0) then
if (offset(inLineLower, tLowerMatchList, x*2-1) > 0) then
put inLine & return after MatchList
end if
end if
end repeat
put timeit(sMS, "Check Matches") into sMS
put MatchList into fld "TheResults"
put stList into fld "SearchTextList"
put tMatchList into fld "TargetText"
put timeit(sMS,"Display All") into sMS
put tTime&cr after fld "SpeedRecords"
unlock screen
end mouseUp
More information about the use-livecode
mailing list