close data all set decimals to 5 create table memosearch ( cTable c(20), cRoutine c(20), cNotes c(32), iIteration i, nTime n(7,5)) private gcTable, gnIterations gnItertions = 5 BenchMark( "wikitopics" ) BenchMark( "lwikitopics" ) BenchMark( "uwikitopics" ) function BenchMark( pcTable ) if ( ! used( (pcTable) ) ) use (pcTable) in 0 endif select (pcTable) gcTable = alias() Iterate( "scan1", "", "raw scan" ) IterateAll( "<wiki", "at front" ) IterateAll( "</wiki", "at end" ) IterateAll( "property", "some hits" ) IterateAll( "thiswillnotbefound", "no hits" ) select cTable, cRoutine, cNotes, avg(nTime), min(nTime), max(nTime) ; from memosearch ; into cursor results ; group by 1,2,3 ; order by 3,2,1 return function IterateAll( pcSearchText, pcNotes ) Iterate( "at1", pcSearchText, pcNotes ) Iterate( "atc1", pcSearchText, pcNotes ) Iterate( "dollar1", pcSearchText, pcNotes ) Iterate( "at1L", pcSearchText, pcNotes ) Iterate( "atc1L", pcSearchText, pcNotes ) Iterate( "dollar1L", pcSearchText, pcNotes ) Iterate( "at1U", pcSearchText, pcNotes ) Iterate( "atc1U", pcSearchText, pcNotes ) Iterate( "dollar1U", pcSearchText, pcNotes ) return function Iterate( pcRoutine, pcSearchText, pcNotes ) local i, lnStart for i = 1 to gnIterations lnStart = seconds() do (pcRoutine) with pcSearchText lnStart = seconds() - lnStart insert into memosearch values ( gcTable, pcRoutine, pcNotes + ":" + pcSearchText, i, lnStart ) endfor return function Scan1( pcJunk ) local lcX scan lcX = mTopic endscan return function At1( pcSearchText ) local i scan i = at( pcSearchText, mTopic ) endscan return function AtC1( pcSearchText ) local i scan i = atc( pcSearchText, mTopic ) endscan return function Dollar1( pcSearchText ) local i scan i = pcSearchText $ mTopic endscan return function At1L( pcSearchText ) local i pcSearchText = lower( pcSearchText ) scan i = at( pcSearchText, lower( mTopic ) ) endscan return function AtC1L( pcSearchText ) local i pcSearchText = lower( pcSearchText ) scan i = atc( pcSearchText, lower( mTopic ) ) endscan return function Dollar1L( pcSearchText ) local i pcSearchText = lower( pcSearchText ) scan i = pcSearchText $ lower( mTopic ) endscan return function At1U( pcSearchText ) local i pcSearchText = upper( pcSearchText ) scan i = at( pcSearchText, upper( mTopic ) ) endscan return function AtC1U( pcSearchText ) local i pcSearchText = upper( pcSearchText ) scan i = atc( pcSearchText, upper( mTopic ) ) endscan return function Dollar1U( pcSearchText ) local i pcSearchText = upper( pcSearchText ) scan i = pcSearchText $ upper( mTopic ) endscan return>I'm using it based on what others have seen. Check out: