Path: ...!news.misty.com!weretis.net!feeder9.news.weretis.net!news.quux.org!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail From: aotto1968 Newsgroups: comp.lang.tcl Subject: Re: good to know: tcl static "regexp" is faster than tcl "string" operation Date: Thu, 2 Jan 2025 20:23:45 +0100 Organization: A noiseless patient Spider Lines: 62 Message-ID: References: <96487bdefbceb235c3b7bfbf6a358ae9@www.novabbs.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Injection-Date: Thu, 02 Jan 2025 20:23:47 +0100 (CET) Injection-Info: dont-email.me; posting-host="9d3496f00138e55f526a31e5dddeac6d"; logging-data="3663048"; mail-complaints-to="abuse@eternal-september.org"; posting-account="U2FsdGVkX1+ozzSrjlMHEhdAMpq04/KgJ2vsY3LC5F0=" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:Vdc/Zoq7RaGSEvRalKJdEE1EeTM= Content-Language: en-US In-Reply-To: <96487bdefbceb235c3b7bfbf6a358ae9@www.novabbs.com> Bytes: 3245 On 02.01.25 12:04, eric wrote: > On Tue, 31 Dec 2024 18:33:41 +0000, aotto1968 wrote: > >> .... >> On 31.12.24 14:46, Rich wrote: >>> >>> But neither is quite as fast as string match (athough regex is close): > > > This kind of regexp generates bytecode using string match instead. > The time difference between both is due to the if-else construct. > > tcl::unsupported::disassemble proc test-1 > ByteCode 0x0450C010, refCt 1, epoch 18, interp 0x0442C8C0 (epoch 18) >  Source "\n   if {[regexp ^:: $val]} {\n     return true\n   } e..." >  Cmds 4, src 81, inst 36, litObjs 3, aux 0, stkDepth 2, code/src 0.00 >  Proc 0x04551488, refCt 1, args 1, compiled locals 1 >      slot 0, scalar, arg, "val" >  Commands 4: >      1: pc 0-34, src 4-79        2: pc 0-5, src 9-23 >      3: pc 9-20, src 34-44        4: pc 23-34, src 63-74 >  Command 1: "if {[regexp ^:: $val]} {\n     return true\n   } else > {..." >  Command 2: "regexp ^:: $val..." >    (0) push1 0     # "::*" >    (2) loadScalar1 %v0     # var "val" >    (4) strmatch +0 >    (6) nop >    (7) jumpFalse1 +16     # pc 23 >  Command 3: "return true..." >    (9) startCommand +12 1     # next cmd at pc 21, 1 cmds start here >    (18) push1 1     # "true" >    (20) done >    (21) jump1 +14     # pc 35 >  Command 4: "return false..." >    (23) startCommand +12 1     # next cmd at pc 35, 1 cmds start here >    (32) push1 2     # "false" >    (34) done >    (35) done > > Eric > > -- other stuff # OLD proc ::myoo::ClassIs {myR cls} { upvar $myR my expr {[llength [lsearch -exact -sorted [set $my(__CLASS__)::__SUPER__SORTED__] $cls]] > 0} } # want to have proc ::myoo::ClassIs {myR cls} { upvar $myR my lsearch -exists -exact -sorted [set $my(__CLASS__)::__SUPER__SORTED__] $cls } ONE simple FLAG erase a lot of code.