<div id="__MailbirdStyleContent" style="font-size: 10pt;font-family: Arial;color: #000000">
                                        
                                        
                                            
                                        
                                        
                                        Here are two other faster versions:<div><br></div><div><div>| p n |</div><div>p := 'WKD'</div><div>n := 'WeakIdentityKeyDictionary'.</div></div><div><br></div><div><div>[ | isMatch lookupIndex |</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>isMatch := true.</div><div><span class="Apple-tab-span" style="white-space:pre">     </span>lookupIndex := 0.</div><div><span class="Apple-tab-span" style="white-space:pre">    </span></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>1 to: p size do: [:charIndex | | char |</div><div><span class="Apple-tab-span" style="white-space:pre">              </span>char := p at: charIndex.</div><div><span class="Apple-tab-span" style="white-space:pre">             </span>isMatch ifTrue: [</div><div><span class="Apple-tab-span" style="white-space:pre">                    </span>lookupIndex := (n findString: char asString startingAt: lookupIndex+1 caseSensitive: true).</div><div><span class="Apple-tab-span" style="white-space:pre">                  </span>isMatch := lookupIndex > 0]].</div><div><span class="Apple-tab-span" style="white-space:pre">     </span>isMatch </div><div>] bench</div><div><b>'3,050,000 per second. 328 nanoseconds per run.'</b></div><div><br></div><div><br></div><div>[ | isMatch lookupIndex |</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>isMatch := true.</div><div><span class="Apple-tab-span" style="white-space:pre">     </span>lookupIndex := 0.</div><div><span class="Apple-tab-span" style="white-space:pre">    </span></div><div><span class="Apple-tab-span" style="white-space:pre">     </span>1 to: p size do: [:charIndex | </div><div><span class="Apple-tab-span" style="white-space:pre">         </span>isMatch := isMatch and: [0 <</div><div><span class="Apple-tab-span" style="white-space:pre">                              </span>(lookupIndex := n</div><div><span class="Apple-tab-span" style="white-space:pre">                                    </span>findString: (p at: charIndex) asString</div><div><span class="Apple-tab-span" style="white-space:pre">                                       </span>startingAt: lookupIndex+1 caseSensitive: true)]].</div><div><span class="Apple-tab-span" style="white-space:pre">    </span>isMatch<span class="Apple-tab-span" style="white-space:pre">             </span></div><div>] bench</div><div><b> '3,080,000 per second. 325 nanoseconds per run.'</b></div></div><div><br></div><div>This is fun. :-D</div><div><br></div><div>Best,</div><div>Marcel</div><div class="mb_sig"></div>
                                        
                                        <blockquote class="history_container" type="cite" style="border-left-style: solid;border-width: 1px;margin-top: 20px;margin-left: 0px;padding-left: 10px;min-width: 500px">
                        <p style="color: #AAAAAA; margin-top: 10px;">Am 16.07.2019 09:11:29 schrieb Marcel Taeumel <marcel.taeumel@hpi.de>:</p><div style="font-family:Arial,Helvetica,sans-serif"><div id="__MailbirdStyleContent" style="font-size: 10pt;font-family: Arial;color: #000000">
                                        
                                        
                                            
                                        
                                        
                                        Hi Kjell,<div><br></div><div>here are more Benchmarks:  </div><div><br></div><div><div>| p n |</div><div>p := 'WKD'</div><div>n := 'WeakIdentityKeyDictionary'.</div><div><br></div><div>[ | first stillAMatch |</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>first := stillAMatch := true.</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>(0 < (p inject: 1 into: [:i :char | </div><div><span class="Apple-tab-span" style="white-space:pre">         </span>stillAMatch ifFalse: [0] ifTrue: [</div><div><span class="Apple-tab-span" style="white-space:pre">                   </span>(n findString: char asString startingAt: i caseSensitive: true)</div><div><span class="Apple-tab-span" style="white-space:pre">                              </span>in: [:i1 | stillAMatch := (first ifTrue: [i = i1] ifFalse: [i < i1]). first := false];</div><div><span class="Apple-tab-span" style="white-space:pre">                            </span>yourself]] ) ) & stillAMatch</div><div>] bench</div><div><b>'1,960,000 per second. 510 nanoseconds per run.'</b></div><div><br></div><div>[ | first i |</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>first := true.</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>i := 0.</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>p allSatisfy: [:char |</div><div><span class="Apple-tab-span" style="white-space:pre">               </span>i := i + 1. </div><div><span class="Apple-tab-span" style="white-space:pre">            </span>(n findString: char asString startingAt: i caseSensitive: true)</div><div><span class="Apple-tab-span" style="white-space:pre">                      </span>in: [:i1 | first ifTrue: [first := false. i = i1] ifFalse: [i < i1] ] ]</div><div>] bench  </div><div><b>'1,770,000 per second. 564 nanoseconds per run.'</b></div><div><br></div><div><br></div><div>[((n select: [:c | c isUppercase and: [p includes: c]]) indexOfSubCollection: p) > 0] bench</div><div><b>'928,000 per second. 1.08 microseconds per run.'</b></div><div><br></div><div>[((n select: [:c | c isUppercase and: [p includes: c]]) findString: p) > 0] bench</div><div><b>'897,000 per second. 1.11 microseconds per run.'</b></div><div><br></div><div>[((n select: [:c | p includes: c]) indexOfSubCollection: p) > 0] bench</div><div><b>'493,000 per second. 2.03 microseconds per run.'</b></div><div><br></div><div>[((n select: [:c | p includes: c]) findString: p) > 0] bench</div><div><b>'495,000 per second. 2.02 microseconds per run.'</b></div><div><br></div></div><div><span style="font-size: 10pt;line-height: 1.5">So, your solution is the fastest. I still wonder why I would need that final "& stillAMatch" at the end? And isn't "i = i1" rather "i1 = 1" and "i < i1" rather "i1 > 0"? And why isn't the starting index increasing? Did I make a copy-and-paste mistake? :-) The pattern 'WWK' should check for two separate $W's. Also, Squeak's cascade is slower than using a temp.</span></div><div><span style="font-size: 10pt;line-height: 1.5"><br></span></div><div><span style="font-size: 10pt;line-height: 1.5">This is the current version:</span></div><div><span style="font-size: 10pt;line-height: 1.5"><br></span></div><div><div>| p n |</div><div>p := 'WKD'</div><div>n := 'WeakIdentityKeyDictionary'.</div><div><br></div><div>[ | first stillAMatch i1 |</div><div><span class="Apple-tab-span" style="white-space:pre">       </span>first := stillAMatch := true.</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>0 < (p inject: 0 into: [:i :char | </div><div><span class="Apple-tab-span" style="white-space:pre">          </span>stillAMatch ifFalse: [0] ifTrue: [</div><div><span class="Apple-tab-span" style="white-space:pre">                   </span>i1 := (n findString: char asString startingAt:<b> i+1</b> caseSensitive: true).</div><div><span class="Apple-tab-span" style="white-space:pre">                  </span>stillAMatch := (first ifTrue: [i1 = 1] ifFalse: [i1 > 0]).</div><div><span class="Apple-tab-span" style="white-space:pre">                        </span>first := false.</div><div><span class="Apple-tab-span" style="white-space:pre">                      </span>i1]] ) </div><div>] bench</div><div><b>'2,390,000 per second. 419 nanoseconds per run.'</b></div></div><div><br></div><div>Best,</div><div>Marcel</div><div class="mb_sig"></div>
                                        
                                        <blockquote class="history_container" type="cite" style="border-left-style: solid;border-width: 1px;margin-top: 20px;margin-left: 0px;padding-left: 10px;min-width: 500px">
                        <p style="color: #AAAAAA; margin-top: 10px;">Am 15.07.2019 21:17:50 schrieb Kjell Godo <squeaklist@gmail.com>:</p><div style="font-family:Arial,Helvetica,sans-serif">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"><div><div dir="auto">?</div></div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto"><span style="font-family: UICTFontTextStyleTallBody;font-size: 17px">( ( eachName select:[ :c | c isUpperCase and:[ pattern includes: c ] ] )</span><div style="font-family: UICTFontTextStyleTallBody;font-size: 17px" dir="auto">     indexOfSubCollection: pattern </div><div style="font-family: UICTFontTextStyleTallBody;font-size: 17px" dir="auto">) > 0<br><br><div dir="ltr"><span style="background-color:rgba(255,255,255,0)">0 < ( ( eachName select:[ :c | pattern includes: c ] ] ) </span><span style="background-color:rgba(255,255,255,0)">indexOfSubCollection: pattern </span><span style="background-color:rgba(255,255,255,0)">)</span></div></div></div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto"><br></div><div><div dir="auto">?</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Jul 15, 2019 at 10:22 tim Rowledge <<a href="mailto:tim@rowledge.org">tim@rowledge.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin: 0 0 0 .8ex;border-left: 1px #ccc solid;padding-left: 1ex;min-width: 500px">I really like making the search tool more helpful; thnak you.<br>
<br>
It reminds me that many (many...) years ago a colleague at ParcPlace did a quick 'soundex' search implementation. It was fairly simple and seemed to work quite well for those times when you don't know the exact speliiiing ov yur thngg. It might be an interesting avenue to wander down.<br>
<br>
tim<br>
--<br>
tim Rowledge; <a href="mailto:tim@rowledge.org" target="_blank">tim@rowledge.org</a>; <a href="http://www.rowledge.org/tim" rel="noreferrer" target="_blank">http://www.rowledge.org/tim</a><br>
Strange OpCodes: CLOUT: Call Long-distance On Unused Telephone<br>
<br>
<br>
<br>
</blockquote></div></div>
</div></blockquote></div></div></blockquote></div>