Change:
(Discovered when reviewing ) This piece of code: generates an extremely complicated assembly. The generated function will try to decode the input string , obtain the first code point, and then compare with (47). Compare with which basically just checks if the first byte of the string is (after an unnecessary (?) check introduced in and another unnecessary pointer-equality check) Most of the time the character as a pattern is a compile-time constant, so it should be more efficient by encoding the char into UTF-8, and then with the input string. (Rust uses the "decoding" approach so that share the same implementation with and via the trait.) This problem is particularly bad for Clippy users, since there is a which suggested changing all by with the assumption that the latter is faster, which as of Rust 1.19 it is the reverse. <details<summaryx8664 ASM</summaryBuild with: First function (): Second function (): </details
Single char cannot be possibly faster than a string, because it will have to encode the character to utf-8 (or decode the string bytes into utf-32, which is what seems to be done here), in general case. I guess the ascii_only optimisation could be implemented, actually. The infrastructure is there, only need to adjust the impl of the matcher.
The performance of startswith constant char and constant string should at least be the same. I'm pretty sure the LLVM optimizer is able to encode the character at compile time to reduce the whole to plus length check. The problem is not really about the unused function , but that the expensive operation (decoding) is done on the haystack which is only known at runtime, rather than (encoding) done on the pattern which can be evaluated at compile time. Yes there wouldn't be improvement for a runtime char, but it should be a pretty rare case.
So, I’ve “optimised” the Pattern to the point where doing is as simple as: The benchmark for 1024 iterations of such call is vs originally. It also regresses patterns such as 4 times (or I’m benchmarking it wrong): from 44µs to 175µs, despite not doing the UTF-8 decoding. Here’s the interesting parts of the code in question: Feels like it was complete waste of my time to look into this.
Thanks for the test! Could you share the benchmarking code? I'll take a look later. My benchmark looks like this , with a 100% speed up (4.5 ns → 2.2 ns) rather than the bland 1.1 ns → 1.0 ns change. (For sure this really doesn't matter unless you do run million times.) (Note: OK this shows and actually may have similar performance, although this also shows that both can be improved.)
is quite literally what I used. Assembly was generated by compiling
is the diff against libcore
So I tried multiple implementation strategies, and none of them really yielded any substantial benefit for overall. In the table below, is the Searcher based on the same algorithm as the string searcher, is a greatly improved variant of the idea above, is a simple patch that does not change the searcher at all, only applies a few small tweaks around, mostly adding inline hints. All of these do end up in being optimised to the desired short assembly, even for non-ASCII case. Despite all that, some of the benchmarks run around 2 times as slow, when compared to original code. I will submit a patch for the other improvements, but I don’t think there’s too much to be done for case specifically. <details<summaryThis is my benchmark results table: </summary<table cellspacing="0" border="0"<tr<th height="17" align="right"<b(&lt;100% → better than original )</b</th<th align="left" sdnum="2057;0;0.00%"Two Way</th<th align="left" sdnum="2057;0;0.00%"Smart Jumping</th<th align="left" sdnum="2057;0;0.00%"This Patch</th<th align="left"Original ns/i</th<th align="left"TWS ns/i</th<th align="left"SJS ns/i</th<th align="left"This Patch ns/i</th</tr<tr<td height="17" align="left"slice::sortlargestrings</td<td align="right" sdval="0." sdnum="2057;0;0.00%"96.16%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"94.96%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"94.88%</td<td align="right" sdval="" sdnum="2057;"</td<td align="right" sdval="" sdnum="2057;"</td<td align="right" sdval="" sdnum="2057;"</td<td align="right" sdval="" sdnum="2057;"</td</tr<tr<td height="17" align="left"slice::sortunstablelargestrings</td<td align="right" sdval="0." sdnum="2057;0;0.00%"96.04%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"93.07%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"91.77%</td<td align="right" sdval="" sdnum="2057;"</td<td align="right" sdval="" sdnum="2057;"</td<td align="right" sdval="" sdnum="2057;"</td<td align="right" sdval="" sdnum="2057;"</td</tr<tr<td height="17" align="left"str::benchcontainsbadnaive</td<td align="right" sdval="1." sdnum="2057;0;0.00%"112.48%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"113.03%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"102.17%</td<td align="right" sdval="737" sdnum="2057;"737</td<td align="right" sdval="829" sdnum="2057;"829</td<td align="right" sdval="833" sdnum="2057;"833</td<td align="right" sdval="753" sdnum="2057;"753</td</tr<tr<td height="17" align="left"str::benchcontainsequal</td<td align="right" sdval="0." sdnum="2057;0;0.00%"75.85%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"97.21%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"92.88%</td<td align="right" sdval="323" sdnum="2057;"323</td<td align="right" sdval="245" sdnum="2057;"245</td<td align="right" sdval="314" sdnum="2057;"314</td<td align="right" sdval="300" sdnum="2057;"300</td</tr<tr<td height="17" align="left"str::benchcontainsshortlong</td<td align="right" sdval="1." sdnum="2057;0;0.00%"110.50%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"109.92%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"102.00%</td<td align="right" sdval="2399" sdnum="2057;"2399</td<td align="right" sdval="2651" sdnum="2057;"2651</td<td align="right" sdval="2637" sdnum="2057;"2637</td<td align="right" sdval="2447" sdnum="2057;"2447</td</tr<tr<td height="17" align="left"str::benchcontainsshortshort</td<td align="right" sdval="1." sdnum="2057;0;0.00%"119.72%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"121.13%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"102.82%</td<td align="right" sdval="71" sdnum="2057;"71</td<td align="right" sdval="85" sdnum="2057;"85</td<td align="right" sdval="86" sdnum="2057;"86</td<td align="right" sdval="73" sdnum="2057;"73</td</tr<tr<td height="17" align="left"str::benchjoin</td<td align="right" sdval="0." sdnum="2057;0;0.00%"96.48%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"96.09%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"95.69%</td<td align="right" sdval="511" sdnum="2057;"511</td<td align="right" sdval="493" sdnum="2057;"493</td<td align="right" sdval="491" sdnum="2057;"491</td<td align="right" sdval="489" sdnum="2057;"489</td</tr<tr<td height="17" align="left"str::charindicesator</td<td align="right" sdval="0." sdnum="2057;0;0.00%"93.44%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"104.92%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"98.36%</td<td align="right" sdval="61" sdnum="2057;"61</td<td align="right" sdval="57" sdnum="2057;"57</td<td align="right" sdval="64" sdnum="2057;"64</td<td align="right" sdval="60" sdnum="2057;"60</td</tr<tr<td height="17" align="left"str::charindicesatorrev</td<td align="right" sdval="0." sdnum="2057;0;0.00%"72.31%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"90.77%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"107.69%</td<td align="right" sdval="65" sdnum="2057;"65</td<td align="right" sdval="47" sdnum="2057;"47</td<td align="right" sdval="59" sdnum="2057;"59</td<td align="right" sdval="70" sdnum="2057;"70</td</tr<tr<td height="17" align="left"str::chariterator</td<td align="right" sdval="0." sdnum="2057;0;0.00%"86.44%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"103.39%</td<td align="right" sdval="1" sdnum="2057;0;0.00%"100.00%</td<td align="right" sdval="59" sdnum="2057;"59</td<td align="right" sdval="51" sdnum="2057;"51</td<td align="right" sdval="61" sdnum="2057;"61</td<td align="right" sdval="59" sdnum="2057;"59</td</tr<tr<td height="17" align="left"str::chariteratorascii</td<td align="right" sdval="0." sdnum="2057;0;0.00%"72.55%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"89.22%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"88.24%</td<td align="right" sdval="204" sdnum="2057;"204</td<td align="right" sdval="148" sdnum="2057;"148</td<td align="right" sdval="182" sdnum="2057;"182</td<td align="right" sdval="180" sdnum="2057;"180</td</tr<tr<td height="17" align="left"str::chariteratorfor</td<td align="right" sdval="0.8" sdnum="2057;0;0.00%"80.00%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"81.54%</td<td align="right" sdval="0.8" sdnum="2057;0;0.00%"80.00%</td<td align="right" sdval="65" sdnum="2057;"65</td<td align="right" sdval="52" sdnum="2057;"52</td<td align="right" sdval="53" sdnum="2057;"53</td<td align="right" sdval="52" sdnum="2057;"52</td</tr<tr<td height="17" align="left"str::chariteratorrev</td<td align="right" sdval="1." sdnum="2057;0;0.00%"131.37%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"119.61%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"98.04%</td<td align="right" sdval="51" sdnum="2057;"51</td<td align="right" sdval="67" sdnum="2057;"67</td<td align="right" sdval="61" sdnum="2057;"61</td<td align="right" sdval="50" sdnum="2057;"50</td</tr<tr<td height="17" align="left"str::chariteratorrevfor</td<td align="right" sdval="1." sdnum="2057;0;0.00%"101.89%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"98.11%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"113.21%</td<td align="right" sdval="53" sdnum="2057;"53</td<td align="right" sdval="54" sdnum="2057;"54</td<td align="right" sdval="52" sdnum="2057;"52</td<td align="right" sdval="60" sdnum="2057;"60</td</tr<tr<td height="17" align="left"str::charscount::longloremipsum</td<td align="right" sdval="0." sdnum="2057;0;0.00%"69.95%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"90.33%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"93.88%</td<td align="right" sdval="2090" sdnum="2057;"2090</td<td align="right" sdval="1462" sdnum="2057;"1462</td<td align="right" sdval="1888" sdnum="2057;"1888</td<td align="right" sdval="1962" sdnum="2057;"1962</td</tr<tr<td height="17" align="left"str::charscount::shortascii</td<td align="right" sdval="0." sdnum="2057;0;0.00%"85.94%</td<td align="right" sdval="1" sdnum="2057;0;0.00%"100.00%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"101.56%</td<td align="right" sdval="64" sdnum="2057;"64</td<td align="right" sdval="55" sdnum="2057;"55</td<td align="right" sdval="64" sdnum="2057;"64</td<td align="right" sdval="65" sdnum="2057;"65</td</tr<tr<td height="17" align="left"str::charscount::shortmixed</td<td align="right" sdval="0." sdnum="2057;0;0.00%"85.92%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"90.14%</td<td align="right" sdval="1" sdnum="2057;0;0.00%"100.00%</td<td align="right" sdval="71" sdnum="2057;"71</td<td align="right" sdval="61" sdnum="2057;"61</td<td align="right" sdval="64" sdnum="2057;"64</td<td align="right" sdval="71" sdnum="2057;"71</td</tr<tr<td height="17" align="left"str::charscount::shortpileofpoo</td<td align="right" sdval="0." sdnum="2057;0;0.00%"86.15%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"103.08%</td<td align="right" sdval="1" sdnum="2057;0;0.00%"100.00%</td<td align="right" sdval="65" sdnum="2057;"65</td<td align="right" sdval="56" sdnum="2057;"56</td<td align="right" sdval="67" sdnum="2057;"67</td<td align="right" sdval="65" sdnum="2057;"65</td</tr<tr<td height="17" align="left"str::containsbangchar::longloremipsum</td<td align="right" sdval="0." sdnum="2057;0;0.00%"25.00%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"25.00%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"24.98%</td<td align="right" sdval="5565" sdnum="2057;"5565</td<td align="right" sdval="1391" sdnum="2057;"1391</td<td align="right" sdval="1391" sdnum="2057;"1391</td<td align="right" sdval="1390" sdnum="2057;"1390</td</tr<tr<td height="17" align="left"str::containsbangchar::shortascii</td<td align="right" sdval="0." sdnum="2057;0;0.00%"27.78%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"27.78%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"27.78%</td<td align="right" sdval="144" sdnum="2057;"144</td<td align="right" sdval="40" sdnum="2057;"40</td<td align="right" sdval="40" sdnum="2057;"40</td<td align="right" sdval="40" sdnum="2057;"40</td</tr<tr<td height="17" align="left"str::containsbangchar::shortmixed</td<td align="right" sdval="0." sdnum="2057;0;0.00%"33.33%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"34.17%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"34.17%</td<td align="right" sdval="120" sdnum="2057;"120</td<td align="right" sdval="40" sdnum="2057;"40</td<td align="right" sdval="41" sdnum="2057;"41</td<td align="right" sdval="41" sdnum="2057;"41</td</tr<tr<td height="17" align="left"str::containsbangchar::shortpileofpoo</td<td align="right" sdval="0." sdnum="2057;0;0.00%"57.97%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"60.87%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"57.97%</td<td align="right" sdval="69" sdnum="2057;"69</td<td align="right" sdval="40" sdnum="2057;"40</td<td align="right" sdval="42" sdnum="2057;"42</td<td align="right" sdval="40" sdnum="2057;"40</td</tr<tr<td height="17" align="left"str::containsbangstr::longloremipsum</td<td align="right" sdval="0." sdnum="2057;0;0.00%"97.00%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"98.04%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"99.36%</td<td align="right" sdval="4836" sdnum="2057;"4836</td<td align="right" sdval="4691" sdnum="2057;"4691</td<td align="right" sdval="4741" sdnum="2057;"4741</td<td align="right" sdval="4805" sdnum="2057;"4805</td</tr<tr<td height="17" align="left"str::containsbangstr::shortascii</td<td align="right" sdval="1." sdnum="2057;0;0.00%"103.54%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"96.46%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"98.99%</td<td align="right" sdval="198" sdnum="2057;"198</td<td align="right" sdval="205" sdnum="2057;"205</td<td align="right" sdval="191" sdnum="2057;"191</td<td align="right" sdval="196" sdnum="2057;"196</td</tr<tr<td height="17" align="left"str::containsbangstr::shortmixed</td<td align="right" sdval="1." sdnum="2057;0;0.00%"104.32%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"98.15%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"100.62%</td<td align="right" sdval="162" sdnum="2057;"162</td<td align="right" sdval="169" sdnum="2057;"169</td<td align="right" sdval="159" sdnum="2057;"159</td<td align="right" sdval="163" sdnum="2057;"163</td</tr<tr<td height="17" align="left"str::containsbangstr::shortpileofpoo</td<td align="right" sdval="1." sdnum="2057;0;0.00%"112.09%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"116.48%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"109.89%</td<td align="right" sdval="91" sdnum="2057;"91</td<td align="right" sdval="102" sdnum="2057;"102</td<td align="right" sdval="106" sdnum="2057;"106</td<td align="right" sdval="100" sdnum="2057;"100</td</tr<tr<td height="17" align="left"str::endswithasciichar::longloremipsum</td<td align="right" sdval="1." sdnum="2057;0;0.00%"106.74%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"106.73%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"101.67%</td<td align="right" sdval="5457" sdnum="2057;"5457</td<td align="right" sdval="5825" sdnum="2057;"5825</td<td align="right" sdval="5824" sdnum="2057;"5824</td<td align="right" sdval="5548" sdnum="2057;"5548</td</tr<tr<td height="17" align="left"str::endswithasciichar::shortascii</td<td align="right" sdval="1." sdnum="2057;0;0.00%"101.72%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"101.76%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"101.76%</td<td align="right" sdval="5453" sdnum="2057;"5453</td<td align="right" sdval="5547" sdnum="2057;"5547</td<td align="right" sdval="5549" sdnum="2057;"5549</td<td align="right" sdval="5549" sdnum="2057;"5549</td</tr<tr<td height="17" align="left"str::endswithasciichar::shortmixed</td<td align="right" sdval="1." sdnum="2057;0;0.00%"103.66%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"108.82%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"103.70%</td<td align="right" sdval="5352" sdnum="2057;"5352</td<td align="right" sdval="5548" sdnum="2057;"5548</td<td align="right" sdval="5824" sdnum="2057;"5824</td<td align="right" sdval="5550" sdnum="2057;"5550</td</tr<tr<td height="17" align="left"str::endswithasciichar::shortpileofpoo</td<td align="right" sdval="1." sdnum="2057;0;0.00%"111.86%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"101.72%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"101.74%</td<td align="right" sdval="5454" sdnum="2057;"5454</td<td align="right" sdval="6101" sdnum="2057;"6101</td<td align="right" sdval="5548" sdnum="2057;"5548</td<td align="right" sdval="5549" sdnum="2057;"5549</td</tr<tr<td height="17" align="left"str::endswithstr::longloremipsum</td<td align="right" sdval="0." sdnum="2057;0;0.00%"88.00%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"92.00%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"84.02%</td<td align="right" sdval="6935" sdnum="2057;"6935</td<td align="right" sdval="6103" sdnum="2057;"6103</td<td align="right" sdval="6380" sdnum="2057;"6380</td<td align="right" sdval="5827" sdnum="2057;"5827</td</tr<tr<td height="17" align="left"str::endswithstr::shortascii</td<td align="right" sdval="0." sdnum="2057;0;0.00%"88.81%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"89.06%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"81.79%</td<td align="right" sdval="7599" sdnum="2057;"7599</td<td align="right" sdval="6749" sdnum="2057;"6749</td<td align="right" sdval="6768" sdnum="2057;"6768</td<td align="right" sdval="6215" sdnum="2057;"6215</td</tr<tr<td height="17" align="left"str::endswithstr::shortmixed</td<td align="right" sdval="0." sdnum="2057;0;0.00%"40.98%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"64.40%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"62.75%</td<td align="right" sdval="2062" sdnum="2057;"2062</td<td align="right" sdval="845" sdnum="2057;"845</td<td align="right" sdval="1328" sdnum="2057;"1328</td<td align="right" sdval="1294" sdnum="2057;"1294</td</tr<tr<td height="17" align="left"str::endswithstr::shortpileofpoo</td<td align="right" sdval="0." sdnum="2057;0;0.00%"40.76%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"61.04%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"60.51%</td<td align="right" sdval="2056" sdnum="2057;"2056</td<td align="right" sdval="838" sdnum="2057;"838</td<td align="right" sdval="1255" sdnum="2057;"1255</td<td align="right" sdval="1244" sdnum="2057;"1244</td</tr<tr<td height="17" align="left"str::endswithunichar::longloremipsum</td<td align="right" sdval="0." sdnum="2057;0;0.00%"91.73%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"101.93%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"91.73%</td<td align="right" sdval="5444" sdnum="2057;"5444</td<td align="right" sdval="4994" sdnum="2057;"4994</td<td align="right" sdval="5549" sdnum="2057;"5549</td<td align="right" sdval="4994" sdnum="2057;"4994</td</tr<tr<td height="17" align="left"str::endswithunichar::shortascii</td<td align="right" sdval="0." sdnum="2057;0;0.00%"91.57%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"101.72%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"91.55%</td<td align="right" sdval="5455" sdnum="2057;"5455</td<td align="right" sdval="4995" sdnum="2057;"4995</td<td align="right" sdval="5549" sdnum="2057;"5549</td<td align="right" sdval="4994" sdnum="2057;"4994</td</tr<tr<td height="17" align="left"str::endswithunichar::shortmixed</td<td align="right" sdval="0." sdnum="2057;0;0.00%"91.35%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"101.48%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"91.33%</td<td align="right" sdval="5468" sdnum="2057;"5468</td<td align="right" sdval="4995" sdnum="2057;"4995</td<td align="right" sdval="5549" sdnum="2057;"5549</td<td align="right" sdval="4994" sdnum="2057;"4994</td</tr<tr<td height="17" align="left"str::endswithunichar::shortpileofpoo</td<td align="right" sdval="0." sdnum="2057;0;0.00%"91.53%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"101.72%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"91.53%</td<td align="right" sdval="5456" sdnum="2057;"5456</td<td align="right" sdval="4994" sdnum="2057;"4994</td<td align="right" sdval="5550" sdnum="2057;"5550</td<td align="right" sdval="4994" sdnum="2057;"4994</td</tr<tr<td height="17" align="left"str::findunderscorechar::longloremipsum</td<td align="right" sdval="0." sdnum="2057;0;0.00%"38.06%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"31.47%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"58.02%</td<td align="right" sdval="5567" sdnum="2057;"5567</td<td align="right" sdval="2119" sdnum="2057;"2119</td<td align="right" sdval="1752" sdnum="2057;"1752</td<td align="right" sdval="3230" sdnum="2057;"3230</td</tr<tr<td height="17" align="left"str::findunderscorechar::shortascii</td<td align="right" sdval="0." sdnum="2057;0;0.00%"67.81%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"39.73%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"63.01%</td<td align="right" sdval="146" sdnum="2057;"146</td<td align="right" sdval="99" sdnum="2057;"99</td<td align="right" sdval="58" sdnum="2057;"58</td<td align="right" sdval="92" sdnum="2057;"92</td</tr<tr<td height="17" align="left"str::findunderscorechar::shortmixed</td<td align="right" sdval="0." sdnum="2057;0;0.00%"81.97%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"48.36%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"68.85%</td<td align="right" sdval="122" sdnum="2057;"122</td<td align="right" sdval="100" sdnum="2057;"100</td<td align="right" sdval="59" sdnum="2057;"59</td<td align="right" sdval="84" sdnum="2057;"84</td</tr<tr<td height="17" align="left"str::findunderscorechar::shortpileofpoo</td<td align="right" sdval="3." sdnum="2057;0;0.00%"372.22%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"81.94%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"91.67%</td<td align="right" sdval="72" sdnum="2057;"72</td<td align="right" sdval="268" sdnum="2057;"268</td<td align="right" sdval="59" sdnum="2057;"59</td<td align="right" sdval="66" sdnum="2057;"66</td</tr<tr<td height="17" align="left"str::findunderscorestr::longloremipsum</td<td align="right" sdval="1." sdnum="2057;0;0.00%"109.79%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"110.74%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"99.68%</td<td align="right" sdval="1899" sdnum="2057;"1899</td<td align="right" sdval="2085" sdnum="2057;"2085</td<td align="right" sdval="2103" sdnum="2057;"2103</td<td align="right" sdval="1893" sdnum="2057;"1893</td</tr<tr<td height="17" align="left"str::findunderscorestr::shortascii</td<td align="right" sdval="1." sdnum="2057;0;0.00%"113.92%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"108.86%</td<td align="right" sdval="1" sdnum="2057;0;0.00%"100.00%</td<td align="right" sdval="79" sdnum="2057;"79</td<td align="right" sdval="90" sdnum="2057;"90</td<td align="right" sdval="86" sdnum="2057;"86</td<td align="right" sdval="79" sdnum="2057;"79</td</tr<tr<td height="17" align="left"str::findunderscorestr::shortmixed</td<td align="right" sdval="1.175" sdnum="2057;0;0.00%"117.50%</td<td align="right" sdval="1.075" sdnum="2057;0;0.00%"107.50%</td<td align="right" sdval="1" sdnum="2057;0;0.00%"100.00%</td<td align="right" sdval="80" sdnum="2057;"80</td<td align="right" sdval="94" sdnum="2057;"94</td<td align="right" sdval="86" sdnum="2057;"86</td<td align="right" sdval="80" sdnum="2057;"80</td</tr<tr<td height="17" align="left"str::findunderscorestr::shortpileofpoo</td<td align="right" sdval="1." sdnum="2057;0;0.00%"102.78%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"103.97%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"99.60%</td<td align="right" sdval="252" sdnum="2057;"252</td<td align="right" sdval="259" sdnum="2057;"259</td<td align="right" sdval="262" sdnum="2057;"262</td<td align="right" sdval="251" sdnum="2057;"251</td</tr<tr<td height="17" align="left"str::findzzzchar::longloremipsum</td<td align="right" sdval="0." sdnum="2057;0;0.00%"17.50%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"31.54%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"58.02%</td<td align="right" sdval="5567" sdnum="2057;"5567</td<td align="right" sdval="974" sdnum="2057;"974</td<td align="right" sdval="1756" sdnum="2057;"1756</td<td align="right" sdval="3230" sdnum="2057;"3230</td</tr<tr<td height="17" align="left"str::findzzzchar::shortascii</td<td align="right" sdval="0." sdnum="2057;0;0.00%"48.97%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"40.69%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"62.76%</td<td align="right" sdval="145" sdnum="2057;"145</td<td align="right" sdval="71" sdnum="2057;"71</td<td align="right" sdval="59" sdnum="2057;"59</td<td align="right" sdval="91" sdnum="2057;"91</td</tr<tr<td height="17" align="left"str::findzzzchar::shortmixed</td<td align="right" sdval="0." sdnum="2057;0;0.00%"51.64%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"49.18%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"68.03%</td<td align="right" sdval="122" sdnum="2057;"122</td<td align="right" sdval="63" sdnum="2057;"63</td<td align="right" sdval="60" sdnum="2057;"60</td<td align="right" sdval="83" sdnum="2057;"83</td</tr<tr<td height="17" align="left"str::findzzzchar::shortpileofpoo</td<td align="right" sdval="0." sdnum="2057;0;0.00%"83.10%</td<td align="right" sdval="2." sdnum="2057;0;0.00%"281.69%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"85.92%</td<td align="right" sdval="71" sdnum="2057;"71</td<td align="right" sdval="59" sdnum="2057;"59</td<td align="right" sdval="200" sdnum="2057;"200</td<td align="right" sdval="61" sdnum="2057;"61</td</tr<tr<td height="17" align="left"str::findzzzstr::longloremipsum</td<td align="right" sdval="0." sdnum="2057;0;0.00%"99.02%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"100.11%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"100.76%</td<td align="right" sdval="921" sdnum="2057;"921</td<td align="right" sdval="912" sdnum="2057;"912</td<td align="right" sdval="922" sdnum="2057;"922</td<td align="right" sdval="928" sdnum="2057;"928</td</tr<tr<td height="17" align="left"str::findzzzstr::shortascii</td<td align="right" sdval="1." sdnum="2057;0;0.00%"115.38%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"119.23%</td<td align="right" sdval="1" sdnum="2057;0;0.00%"100.00%</td<td align="right" sdval="52" sdnum="2057;"52</td<td align="right" sdval="60" sdnum="2057;"60</td<td align="right" sdval="62" sdnum="2057;"62</td<td align="right" sdval="52" sdnum="2057;"52</td</tr<tr<td height="17" align="left"str::findzzzstr::shortmixed</td<td align="right" sdval="1." sdnum="2057;0;0.00%"113.95%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"106.98%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"93.02%</td<td align="right" sdval="43" sdnum="2057;"43</td<td align="right" sdval="49" sdnum="2057;"49</td<td align="right" sdval="46" sdnum="2057;"46</td<td align="right" sdval="40" sdnum="2057;"40</td</tr<tr<td height="17" align="left"str::findzzzstr::shortpileofpoo</td<td align="right" sdval="1.45" sdnum="2057;0;0.00%"145.00%</td<td align="right" sdval="1.15" sdnum="2057;0;0.00%"115.00%</td<td align="right" sdval="1" sdnum="2057;0;0.00%"100.00%</td<td align="right" sdval="40" sdnum="2057;"40</td<td align="right" sdval="58" sdnum="2057;"58</td<td align="right" sdval="46" sdnum="2057;"46</td<td align="right" sdval="40" sdnum="2057;"40</td</tr<tr<td height="17" align="left"str::matchindicesastr::longloremipsum</td<td align="right" sdval="0." sdnum="2057;0;0.00%"99.64%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"100.08%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"98.66%</td<td align="right" sdval="5229" sdnum="2057;"5229</td<td align="right" sdval="5210" sdnum="2057;"5210</td<td align="right" sdval="5233" sdnum="2057;"5233</td<td align="right" sdval="5159" sdnum="2057;"5159</td</tr<tr<td height="17" align="left"str::matchindicesastr::shortascii</td<td align="right" sdval="0." sdnum="2057;0;0.00%"92.94%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"102.60%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"98.51%</td<td align="right" sdval="269" sdnum="2057;"269</td<td align="right" sdval="250" sdnum="2057;"250</td<td align="right" sdval="276" sdnum="2057;"276</td<td align="right" sdval="265" sdnum="2057;"265</td</tr<tr<td height="17" align="left"str::matchindicesastr::shortmixed</td<td align="right" sdval="0." sdnum="2057;0;0.00%"98.03%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"108.37%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"100.99%</td<td align="right" sdval="203" sdnum="2057;"203</td<td align="right" sdval="199" sdnum="2057;"199</td<td align="right" sdval="220" sdnum="2057;"220</td<td align="right" sdval="205" sdnum="2057;"205</td</tr<tr<td height="17" align="left"str::matchindicesastr::shortpileofpoo</td<td align="right" sdval="1." sdnum="2057;0;0.00%"103.81%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"117.14%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"94.29%</td<td align="right" sdval="105" sdnum="2057;"105</td<td align="right" sdval="109" sdnum="2057;"109</td<td align="right" sdval="123" sdnum="2057;"123</td<td align="right" sdval="99" sdnum="2057;"99</td</tr<tr<td height="17" align="left"str::rfindunderscorechar::longloremipsum</td<td align="right" sdval="0." sdnum="2057;0;0.00%"20.16%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"86.09%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"29.20%</td<td align="right" sdval="7124" sdnum="2057;"7124</td<td align="right" sdval="1436" sdnum="2057;"1436</td<td align="right" sdval="6133" sdnum="2057;"6133</td<td align="right" sdval="2080" sdnum="2057;"2080</td</tr<tr<td height="17" align="left"str::rfindunderscorechar::shortascii</td<td align="right" sdval="0." sdnum="2057;0;0.00%"43.59%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"98.46%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"31.79%</td<td align="right" sdval="195" sdnum="2057;"195</td<td align="right" sdval="85" sdnum="2057;"85</td<td align="right" sdval="192" sdnum="2057;"192</td<td align="right" sdval="62" sdnum="2057;"62</td</tr<tr<td height="17" align="left"str::rfindunderscorechar::shortmixed</td<td align="right" sdval="0." sdnum="2057;0;0.00%"51.50%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"116.77%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"37.72%</td<td align="right" sdval="167" sdnum="2057;"167</td<td align="right" sdval="86" sdnum="2057;"86</td<td align="right" sdval="195" sdnum="2057;"195</td<td align="right" sdval="63" sdnum="2057;"63</td</tr<tr<td height="17" align="left"str::rfindunderscorechar::shortpileofpoo</td<td align="right" sdval="2." sdnum="2057;0;0.00%"256.57%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"196.97%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"45.45%</td<td align="right" sdval="99" sdnum="2057;"99</td<td align="right" sdval="254" sdnum="2057;"254</td<td align="right" sdval="195" sdnum="2057;"195</td<td align="right" sdval="45" sdnum="2057;"45</td</tr<tr<td height="17" align="left"str::rfindzzzchar::longloremipsum</td<td align="right" sdval="0." sdnum="2057;0;0.00%"13.35%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"86.03%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"29.18%</td<td align="right" sdval="7129" sdnum="2057;"7129</td<td align="right" sdval="952" sdnum="2057;"952</td<td align="right" sdval="6133" sdnum="2057;"6133</td<td align="right" sdval="2080" sdnum="2057;"2080</td</tr<tr<td height="17" align="left"str::rfindzzzchar::shortascii</td<td align="right" sdval="0." sdnum="2057;0;0.00%"28.35%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"98.97%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"31.96%</td<td align="right" sdval="194" sdnum="2057;"194</td<td align="right" sdval="55" sdnum="2057;"55</td<td align="right" sdval="192" sdnum="2057;"192</td<td align="right" sdval="62" sdnum="2057;"62</td</tr<tr<td height="17" align="left"str::rfindzzzchar::shortmixed</td<td align="right" sdval="0." sdnum="2057;0;0.00%"43.20%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"114.79%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"36.69%</td<td align="right" sdval="169" sdnum="2057;"169</td<td align="right" sdval="73" sdnum="2057;"73</td<td align="right" sdval="194" sdnum="2057;"194</td<td align="right" sdval="62" sdnum="2057;"62</td</tr<tr<td height="17" align="left"str::rfindzzzchar::shortpileofpoo</td<td align="right" sdval="5." sdnum="2057;0;0.00%"541.41%</td<td align="right" sdval="7." sdnum="2057;0;0.00%"716.16%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"45.45%</td<td align="right" sdval="99" sdnum="2057;"99</td<td align="right" sdval="536" sdnum="2057;"536</td<td align="right" sdval="709" sdnum="2057;"709</td<td align="right" sdval="45" sdnum="2057;"45</td</tr<tr<td height="17" align="left"str::rsplitnspacechar::longloremipsum</td<td align="right" sdval="2." sdnum="2057;0;0.00%"216.55%</td<td align="right" sdval="3." sdnum="2057;0;0.00%"362.07%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"101.38%</td<td align="right" sdval="145" sdnum="2057;"145</td<td align="right" sdval="314" sdnum="2057;"314</td<td align="right" sdval="525" sdnum="2057;"525</td<td align="right" sdval="147" sdnum="2057;"147</td</tr<tr<td height="17" align="left"str::rsplitnspacechar::shortascii</td<td align="right" sdval="2.4" sdnum="2057;0;0.00%"240.00%</td<td align="right" sdval="3.424" sdnum="2057;0;0.00%"342.40%</td<td align="right" sdval="1.016" sdnum="2057;0;0.00%"101.60%</td<td align="right" sdval="125" sdnum="2057;"125</td<td align="right" sdval="300" sdnum="2057;"300</td<td align="right" sdval="428" sdnum="2057;"428</td<td align="right" sdval="127" sdnum="2057;"127</td</tr<tr<td height="17" align="left"str::rsplitnspacechar::shortmixed</td<td align="right" sdval="2." sdnum="2057;0;0.00%"266.13%</td<td align="right" sdval="3." sdnum="2057;0;0.00%"384.68%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"102.42%</td<td align="right" sdval="124" sdnum="2057;"124</td<td align="right" sdval="330" sdnum="2057;"330</td<td align="right" sdval="477" sdnum="2057;"477</td<td align="right" sdval="127" sdnum="2057;"127</td</tr<tr<td height="17" align="left"str::rsplitnspacechar::shortpileofpoo</td<td align="right" sdval="1." sdnum="2057;0;0.00%"155.07%</td<td align="right" sdval="3." sdnum="2057;0;0.00%"315.94%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"101.45%</td<td align="right" sdval="69" sdnum="2057;"69</td<td align="right" sdval="107" sdnum="2057;"107</td<td align="right" sdval="218" sdnum="2057;"218</td<td align="right" sdval="70" sdnum="2057;"70</td</tr<tr<td height="17" align="left"str::splitastr::longloremipsum</td<td align="right" sdval="0." sdnum="2057;0;0.00%"97.46%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"100.19%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"100.53%</td<td align="right" sdval="5275" sdnum="2057;"5275</td<td align="right" sdval="5141" sdnum="2057;"5141</td<td align="right" sdval="5285" sdnum="2057;"5285</td<td align="right" sdval="5303" sdnum="2057;"5303</td</tr<tr<td height="17" align="left"str::splitastr::shortascii</td<td align="right" sdval="0." sdnum="2057;0;0.00%"91.79%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"102.86%</td<td align="right" sdval="0.9" sdnum="2057;0;0.00%"90.00%</td<td align="right" sdval="280" sdnum="2057;"280</td<td align="right" sdval="257" sdnum="2057;"257</td<td align="right" sdval="288" sdnum="2057;"288</td<td align="right" sdval="252" sdnum="2057;"252</td</tr<tr<td height="17" align="left"str::splitastr::shortmixed</td<td align="right" sdval="0." sdnum="2057;0;0.00%"95.37%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"103.70%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"92.59%</td<td align="right" sdval="216" sdnum="2057;"216</td<td align="right" sdval="206" sdnum="2057;"206</td<td align="right" sdval="224" sdnum="2057;"224</td<td align="right" sdval="200" sdnum="2057;"200</td</tr<tr<td height="17" align="left"str::splitastr::shortpileofpoo</td<td align="right" sdval="1." sdnum="2057;0;0.00%"103.48%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"102.61%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"93.04%</td<td align="right" sdval="115" sdnum="2057;"115</td<td align="right" sdval="119" sdnum="2057;"119</td<td align="right" sdval="118" sdnum="2057;"118</td<td align="right" sdval="107" sdnum="2057;"107</td</tr<tr<td height="17" align="left"str::splitadstr::longloremipsum</td<td align="right" sdval="0." sdnum="2057;0;0.00%"95.38%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"99.18%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"99.35%</td<td align="right" sdval="2925" sdnum="2057;"2925</td<td align="right" sdval="2790" sdnum="2057;"2790</td<td align="right" sdval="2901" sdnum="2057;"2901</td<td align="right" sdval="2906" sdnum="2057;"2906</td</tr<tr<td height="17" align="left"str::splitadstr::shortascii</td<td align="right" sdval="0." sdnum="2057;0;0.00%"92.96%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"100.94%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"90.14%</td<td align="right" sdval="213" sdnum="2057;"213</td<td align="right" sdval="198" sdnum="2057;"198</td<td align="right" sdval="215" sdnum="2057;"215</td<td align="right" sdval="192" sdnum="2057;"192</td</tr<tr<td height="17" align="left"str::splitadstr::shortmixed</td<td align="right" sdval="1" sdnum="2057;0;0.00%"100.00%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"102.44%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"93.50%</td<td align="right" sdval="123" sdnum="2057;"123</td<td align="right" sdval="123" sdnum="2057;"123</td<td align="right" sdval="126" sdnum="2057;"126</td<td align="right" sdval="115" sdnum="2057;"115</td</tr<tr<td height="17" align="left"str::splitadstr::shortpileofpoo</td<td align="right" sdval="1." sdnum="2057;0;0.00%"101.33%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"105.33%</td<td align="right" sdval="0.88" sdnum="2057;0;0.00%"88.00%</td<td align="right" sdval="75" sdnum="2057;"75</td<td align="right" sdval="76" sdnum="2057;"76</td<td align="right" sdval="79" sdnum="2057;"79</td<td align="right" sdval="66" sdnum="2057;"66</td</tr<tr<td height="17" align="left"str::splitascii</td<td align="right" sdval="1." sdnum="2057;0;0.00%"174.80%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"143.31%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"98.43%</td<td align="right" sdval="127" sdnum="2057;"127</td<td align="right" sdval="222" sdnum="2057;"222</td<td align="right" sdval="182" sdnum="2057;"182</td<td align="right" sdval="125" sdnum="2057;"125</td</tr<tr<td height="17" align="left"str::splitclosure</td<td align="right" sdval="0." sdnum="2057;0;0.00%"95.97%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"97.58%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"98.39%</td<td align="right" sdval="124" sdnum="2057;"124</td<td align="right" sdval="119" sdnum="2057;"119</td<td align="right" sdval="121" sdnum="2057;"121</td<td align="right" sdval="122" sdnum="2057;"122</td</tr<tr<td height="17" align="left"str::splitexternfn</td<td align="right" sdval="0." sdnum="2057;0;0.00%"85.65%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"95.22%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"100.96%</td<td align="right" sdval="209" sdnum="2057;"209</td<td align="right" sdval="179" sdnum="2057;"179</td<td align="right" sdval="199" sdnum="2057;"199</td<td align="right" sdval="211" sdnum="2057;"211</td</tr<tr<td height="17" align="left"str::splitslice</td<td align="right" sdval="0." sdnum="2057;0;0.00%"92.26%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"101.61%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"98.39%</td<td align="right" sdval="310" sdnum="2057;"310</td<td align="right" sdval="286" sdnum="2057;"286</td<td align="right" sdval="315" sdnum="2057;"315</td<td align="right" sdval="305" sdnum="2057;"305</td</tr<tr<td height="17" align="left"str::splitspacechar::longloremipsum</td<td align="right" sdval="1." sdnum="2057;0;0.00%"136.49%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"155.89%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"101.95%</td<td align="right" sdval="6974" sdnum="2057;"6974</td<td align="right" sdval="9519" sdnum="2057;"9519</td<td align="right" sdval="" sdnum="2057;"</td<td align="right" sdval="7110" sdnum="2057;"7110</td</tr<tr<td height="17" align="left"str::splitspacechar::shortascii</td<td align="right" sdval="1." sdnum="2057;0;0.00%"198.83%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"186.55%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"98.83%</td<td align="right" sdval="171" sdnum="2057;"171</td<td align="right" sdval="340" sdnum="2057;"340</td<td align="right" sdval="319" sdnum="2057;"319</td<td align="right" sdval="169" sdnum="2057;"169</td</tr<tr<td height="17" align="left"str::splitspacechar::shortmixed</td<td align="right" sdval="2." sdnum="2057;0;0.00%"226.12%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"173.88%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"102.99%</td<td align="right" sdval="134" sdnum="2057;"134</td<td align="right" sdval="303" sdnum="2057;"303</td<td align="right" sdval="233" sdnum="2057;"233</td<td align="right" sdval="138" sdnum="2057;"138</td</tr<tr<td height="17" align="left"str::splitspacechar::shortpileofpoo</td<td align="right" sdval="1." sdnum="2057;0;0.00%"140.24%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"96.34%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"112.20%</td<td align="right" sdval="82" sdnum="2057;"82</td<td align="right" sdval="115" sdnum="2057;"115</td<td align="right" sdval="79" sdnum="2057;"79</td<td align="right" sdval="92" sdnum="2057;"92</td</tr<tr<td height="17" align="left"str::splitspacestr::longloremipsum</td<td align="right" sdval="0." sdnum="2057;0;0.00%"94.18%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"99.72%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"100.74%</td<td align="right" sdval="8901" sdnum="2057;"8901</td<td align="right" sdval="8383" sdnum="2057;"8383</td<td align="right" sdval="8876" sdnum="2057;"8876</td<td align="right" sdval="8967" sdnum="2057;"8967</td</tr<tr<td height="17" align="left"str::splitspacestr::shortascii</td<td align="right" sdval="0.9125" sdnum="2057;0;0.00%"91.25%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"100.94%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"91.88%</td<td align="right" sdval="320" sdnum="2057;"320</td<td align="right" sdval="292" sdnum="2057;"292</td<td align="right" sdval="323" sdnum="2057;"323</td<td align="right" sdval="294" sdnum="2057;"294</td</tr<tr<td height="17" align="left"str::splitspacestr::shortmixed</td<td align="right" sdval="0." sdnum="2057;0;0.00%"92.04%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"102.77%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"90.31%</td<td align="right" sdval="289" sdnum="2057;"289</td<td align="right" sdval="266" sdnum="2057;"266</td<td align="right" sdval="297" sdnum="2057;"297</td<td align="right" sdval="261" sdnum="2057;"261</td</tr<tr<td height="17" align="left"str::splitspacestr::shortpileofpoo</td<td align="right" sdval="1." sdnum="2057;0;0.00%"103.57%</td<td align="right" sdval="1" sdnum="2057;0;0.00%"100.00%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"97.32%</td<td align="right" sdval="112" sdnum="2057;"112</td<td align="right" sdval="116" sdnum="2057;"116</td<td align="right" sdval="112" sdnum="2057;"112</td<td align="right" sdval="109" sdnum="2057;"109</td</tr<tr<td height="17" align="left"str::splitterminatorspacechar::longloremipsum</td<td align="right" sdval="1." sdnum="2057;0;0.00%"135.04%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"153.38%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"109.07%</td<td align="right" sdval="7037" sdnum="2057;"7037</td<td align="right" sdval="9503" sdnum="2057;"9503</td<td align="right" sdval="" sdnum="2057;"</td<td align="right" sdval="7675" sdnum="2057;"7675</td</tr<tr<td height="17" align="left"str::splitterminatorspacechar::shortascii</td<td align="right" sdval="1." sdnum="2057;0;0.00%"196.51%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"183.72%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"98.26%</td<td align="right" sdval="172" sdnum="2057;"172</td<td align="right" sdval="338" sdnum="2057;"338</td<td align="right" sdval="316" sdnum="2057;"316</td<td align="right" sdval="169" sdnum="2057;"169</td</tr<tr<td height="17" align="left"str::splitterminatorspacechar::shortmixed</td<td align="right" sdval="2." sdnum="2057;0;0.00%"207.59%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"156.55%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"94.48%</td<td align="right" sdval="145" sdnum="2057;"145</td<td align="right" sdval="301" sdnum="2057;"301</td<td align="right" sdval="227" sdnum="2057;"227</td<td align="right" sdval="137" sdnum="2057;"137</td</tr<tr<td height="17" align="left"str::splitterminatorspacechar::shortpileofpoo</td<td align="right" sdval="1." sdnum="2057;0;0.00%"136.90%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"92.86%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"108.33%</td<td align="right" sdval="84" sdnum="2057;"84</td<td align="right" sdval="115" sdnum="2057;"115</td<td align="right" sdval="78" sdnum="2057;"78</td<td align="right" sdval="91" sdnum="2057;"91</td</tr<tr<td height="17" align="left"str::splitunicodeascii</td<td align="right" sdval="1." sdnum="2057;0;0.00%"127.21%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"89.71%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"104.41%</td<td align="right" sdval="136" sdnum="2057;"136</td<td align="right" sdval="173" sdnum="2057;"173</td<td align="right" sdval="122" sdnum="2057;"122</td<td align="right" sdval="142" sdnum="2057;"142</td</tr<tr<td height="17" align="left"str::splitnspacechar::longloremipsum</td<td align="right" sdval="1." sdnum="2057;0;0.00%"141.24%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"134.02%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"97.94%</td<td align="right" sdval="194" sdnum="2057;"194</td<td align="right" sdval="274" sdnum="2057;"274</td<td align="right" sdval="260" sdnum="2057;"260</td<td align="right" sdval="190" sdnum="2057;"190</td</tr<tr<td height="17" align="left"str::splitnspacechar::shortascii</td<td align="right" sdval="1." sdnum="2057;0;0.00%"188.41%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"165.94%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"94.93%</td<td align="right" sdval="138" sdnum="2057;"138</td<td align="right" sdval="260" sdnum="2057;"260</td<td align="right" sdval="229" sdnum="2057;"229</td<td align="right" sdval="131" sdnum="2057;"131</td</tr<tr<td height="17" align="left"str::splitnspacechar::shortmixed</td<td align="right" sdval="2." sdnum="2057;0;0.00%"220.71%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"169.29%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"101.43%</td<td align="right" sdval="140" sdnum="2057;"140</td<td align="right" sdval="309" sdnum="2057;"309</td<td align="right" sdval="237" sdnum="2057;"237</td<td align="right" sdval="142" sdnum="2057;"142</td</tr<tr<td height="17" align="left"str::splitnspacechar::shortpileofpoo</td<td align="right" sdval="1." sdnum="2057;0;0.00%"144.05%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"98.81%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"105.95%</td<td align="right" sdval="84" sdnum="2057;"84</td<td align="right" sdval="121" sdnum="2057;"121</td<td align="right" sdval="83" sdnum="2057;"83</td<td align="right" sdval="89" sdnum="2057;"89</td</tr<tr<td height="17" align="left"str::startswithasciichar::longloremipsum</td<td align="right" sdval="2." sdnum="2057;0;0.00%"235.84%</td<td align="right" sdval="2." sdnum="2057;0;0.00%"235.88%</td<td align="right" sdval="2." sdnum="2057;0;0.00%"235.88%</td<td align="right" sdval="2352" sdnum="2057;"2352</td<td align="right" sdval="5547" sdnum="2057;"5547</td<td align="right" sdval="5548" sdnum="2057;"5548</td<td align="right" sdval="5548" sdnum="2057;"5548</td</tr<tr<td height="17" align="left"str::startswithasciichar::shortascii</td<td align="right" sdval="2." sdnum="2057;0;0.00%"236.04%</td<td align="right" sdval="2." sdnum="2057;0;0.00%"236.09%</td<td align="right" sdval="2." sdnum="2057;0;0.00%"236.09%</td<td align="right" sdval="2350" sdnum="2057;"2350</td<td align="right" sdval="5547" sdnum="2057;"5547</td<td align="right" sdval="5548" sdnum="2057;"5548</td<td align="right" sdval="5548" sdnum="2057;"5548</td</tr<tr<td height="17" align="left"str::startswithasciichar::shortmixed</td<td align="right" sdval="1." sdnum="2057;0;0.00%"182.80%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"174.11%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"174.14%</td<td align="right" sdval="3186" sdnum="2057;"3186</td<td align="right" sdval="5824" sdnum="2057;"5824</td<td align="right" sdval="5547" sdnum="2057;"5547</td<td align="right" sdval="5548" sdnum="2057;"5548</td</tr<tr<td height="17" align="left"str::startswithasciichar::shortpileofpoo</td<td align="right" sdval="1." sdnum="2057;0;0.00%"148.91%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"148.94%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"148.94%</td<td align="right" sdval="3725" sdnum="2057;"3725</td<td align="right" sdval="5547" sdnum="2057;"5547</td<td align="right" sdval="5548" sdnum="2057;"5548</td<td align="right" sdval="5548" sdnum="2057;"5548</td</tr<tr<td height="17" align="left"str::startswithstr::longloremipsum</td<td align="right" sdval="0." sdnum="2057;0;0.00%"77.90%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"77.20%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"74.37%</td<td align="right" sdval="7834" sdnum="2057;"7834</td<td align="right" sdval="6103" sdnum="2057;"6103</td<td align="right" sdval="6048" sdnum="2057;"6048</td<td align="right" sdval="5826" sdnum="2057;"5826</td</tr<tr<td height="17" align="left"str::startswithstr::shortascii</td<td align="right" sdval="0." sdnum="2057;0;0.00%"78.52%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"72.29%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"75.51%</td<td align="right" sdval="8595" sdnum="2057;"8595</td<td align="right" sdval="6749" sdnum="2057;"6749</td<td align="right" sdval="6213" sdnum="2057;"6213</td<td align="right" sdval="6490" sdnum="2057;"6490</td</tr<tr<td height="17" align="left"str::startswithstr::shortmixed</td<td align="right" sdval="0." sdnum="2057;0;0.00%"80.30%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"76.67%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"76.67%</td<td align="right" sdval="7600" sdnum="2057;"7600</td<td align="right" sdval="6103" sdnum="2057;"6103</td<td align="right" sdval="5827" sdnum="2057;"5827</td<td align="right" sdval="5827" sdnum="2057;"5827</td</tr<tr<td height="17" align="left"str::startswithstr::shortpileofpoo</td<td align="right" sdval="0." sdnum="2057;0;0.00%"80.04%</td<td align="right" sdval="0.9" sdnum="2057;0;0.00%"90.00%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"80.04%</td<td align="right" sdval="5550" sdnum="2057;"5550</td<td align="right" sdval="4442" sdnum="2057;"4442</td<td align="right" sdval="4995" sdnum="2057;"4995</td<td align="right" sdval="4442" sdnum="2057;"4442</td</tr<tr<td height="17" align="left"str::startswithunichar::longloremipsum</td<td align="right" sdval="2." sdnum="2057;0;0.00%"211.75%</td<td align="right" sdval="2." sdnum="2057;0;0.00%"235.33%</td<td align="right" sdval="2." sdnum="2057;0;0.00%"211.87%</td<td align="right" sdval="2358" sdnum="2057;"2358</td<td align="right" sdval="4993" sdnum="2057;"4993</td<td align="right" sdval="5549" sdnum="2057;"5549</td<td align="right" sdval="4996" sdnum="2057;"4996</td</tr<tr<td height="17" align="left"str::startswithunichar::shortascii</td<td align="right" sdval="2." sdnum="2057;0;0.00%"212.87%</td<td align="right" sdval="2." sdnum="2057;0;0.00%"236.53%</td<td align="right" sdval="2." sdnum="2057;0;0.00%"212.83%</td<td align="right" sdval="2346" sdnum="2057;"2346</td<td align="right" sdval="4994" sdnum="2057;"4994</td<td align="right" sdval="5549" sdnum="2057;"5549</td<td align="right" sdval="4993" sdnum="2057;"4993</td</tr<tr<td height="17" align="left"str::startswithunichar::shortmixed</td<td align="right" sdval="1." sdnum="2057;0;0.00%"164.48%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"181.80%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"155.87%</td<td align="right" sdval="3204" sdnum="2057;"3204</td<td align="right" sdval="5270" sdnum="2057;"5270</td<td align="right" sdval="5825" sdnum="2057;"5825</td<td align="right" sdval="4994" sdnum="2057;"4994</td</tr<tr<td height="17" align="left"str::startswithunichar::shortpileofpoo</td<td align="right" sdval="1." sdnum="2057;0;0.00%"134.07%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"148.94%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"141.48%</td<td align="right" sdval="3725" sdnum="2057;"3725</td<td align="right" sdval="4994" sdnum="2057;"4994</td<td align="right" sdval="5548" sdnum="2057;"5548</td<td align="right" sdval="5270" sdnum="2057;"5270</td</tr<tr<td height="17" align="left"str::trimasciichar::longloremipsum</td<td align="right" sdval="0." sdnum="2057;0;0.00%"95.30%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"100.11%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"114.31%</td<td align="right" sdval="3635" sdnum="2057;"3635</td<td align="right" sdval="3464" sdnum="2057;"3464</td<td align="right" sdval="3639" sdnum="2057;"3639</td<td align="right" sdval="4155" sdnum="2057;"4155</td</tr<tr<td height="17" align="left"str::trimasciichar::shortascii</td<td align="right" sdval="0." sdnum="2057;0;0.00%"90.38%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"114.42%</td<td align="right" sdval="1.125" sdnum="2057;0;0.00%"112.50%</td<td align="right" sdval="104" sdnum="2057;"104</td<td align="right" sdval="94" sdnum="2057;"94</td<td align="right" sdval="119" sdnum="2057;"119</td<td align="right" sdval="117" sdnum="2057;"117</td</tr<tr<td height="17" align="left"str::trimasciichar::shortmixed</td<td align="right" sdval="0." sdnum="2057;0;0.00%"79.10%</td<td align="right" sdval="1" sdnum="2057;0;0.00%"100.00%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"98.51%</td<td align="right" sdval="67" sdnum="2057;"67</td<td align="right" sdval="53" sdnum="2057;"53</td<td align="right" sdval="67" sdnum="2057;"67</td<td align="right" sdval="66" sdnum="2057;"66</td</tr<tr<td height="17" align="left"str::trimasciichar::shortpileofpoo</td<td align="right" sdval="1." sdnum="2057;0;0.00%"116.67%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"116.67%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"116.67%</td<td align="right" sdval="12" sdnum="2057;"12</td<td align="right" sdval="14" sdnum="2057;"14</td<td align="right" sdval="14" sdnum="2057;"14</td<td align="right" sdval="14" sdnum="2057;"14</td</tr<tr<td height="17" align="left"str::trimleftasciichar::longloremipsum</td<td align="right" sdval="0." sdnum="2057;0;0.00%"99.91%</td<td align="right" sdval="1" sdnum="2057;0;0.00%"100.00%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"100.03%</td<td align="right" sdval="3464" sdnum="2057;"3464</td<td align="right" sdval="3461" sdnum="2057;"3461</td<td align="right" sdval="3464" sdnum="2057;"3464</td<td align="right" sdval="3465" sdnum="2057;"3465</td</tr<tr<td height="17" align="left"str::trimleftasciichar::shortascii</td<td align="right" sdval="0." sdnum="2057;0;0.00%"97.98%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"101.01%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"104.04%</td<td align="right" sdval="99" sdnum="2057;"99</td<td align="right" sdval="97" sdnum="2057;"97</td<td align="right" sdval="100" sdnum="2057;"100</td<td align="right" sdval="103" sdnum="2057;"103</td</tr<tr<td height="17" align="left"str::trimleftasciichar::shortmixed</td<td align="right" sdval="1" sdnum="2057;0;0.00%"100.00%</td<td align="right" sdval="1" sdnum="2057;0;0.00%"100.00%</td<td align="right" sdval="1" sdnum="2057;0;0.00%"100.00%</td<td align="right" sdval="7" sdnum="2057;"7</td<td align="right" sdval="7" sdnum="2057;"7</td<td align="right" sdval="7" sdnum="2057;"7</td<td align="right" sdval="7" sdnum="2057;"7</td</tr<tr<td height="17" align="left"str::trimleftasciichar::shortpileofpoo</td<td align="right" sdval="1" sdnum="2057;0;0.00%"100.00%</td<td align="right" sdval="1" sdnum="2057;0;0.00%"100.00%</td<td align="right" sdval="1" sdnum="2057;0;0.00%"100.00%</td<td align="right" sdval="8" sdnum="2057;"8</td<td align="right" sdval="8" sdnum="2057;"8</td<td align="right" sdval="8" sdnum="2057;"8</td<td align="right" sdval="8" sdnum="2057;"8</td</tr<tr<td height="17" align="left"str::trimrightasciichar::longloremipsum</td<td align="right" sdval="1." sdnum="2057;0;0.00%"133.01%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"133.11%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"133.06%</td<td align="right" sdval="2084" sdnum="2057;"2084</td<td align="right" sdval="2772" sdnum="2057;"2772</td<td align="right" sdval="2774" sdnum="2057;"2774</td<td align="right" sdval="2773" sdnum="2057;"2773</td</tr<tr<td height="17" align="left"str::trimrightasciichar::shortascii</td<td align="right" sdval="1." sdnum="2057;0;0.00%"114.49%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"118.84%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"117.39%</td<td align="right" sdval="69" sdnum="2057;"69</td<td align="right" sdval="79" sdnum="2057;"79</td<td align="right" sdval="82" sdnum="2057;"82</td<td align="right" sdval="81" sdnum="2057;"81</td</tr<tr<td height="17" align="left"str::trimrightasciichar::shortmixed</td<td align="right" sdval="1." sdnum="2057;0;0.00%"122.92%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"129.17%</td<td align="right" sdval="1.25" sdnum="2057;0;0.00%"125.00%</td<td align="right" sdval="48" sdnum="2057;"48</td<td align="right" sdval="59" sdnum="2057;"59</td<td align="right" sdval="62" sdnum="2057;"62</td<td align="right" sdval="60" sdnum="2057;"60</td</tr<tr<td height="17" align="left"str::trimrightasciichar::shortpileofpoo</td<td align="right" sdval="1" sdnum="2057;0;0.00%"100.00%</td<td align="right" sdval="1.25" sdnum="2057;0;0.00%"125.00%</td<td align="right" sdval="1.25" sdnum="2057;0;0.00%"125.00%</td<td align="right" sdval="8" sdnum="2057;"8</td<td align="right" sdval="8" sdnum="2057;"8</td<td align="right" sdval="10" sdnum="2057;"10</td<td align="right" sdval="10" sdnum="2057;"10</td</tr<tr<td height="17" align="left"string::benchexactsizeshrinktofit</td<td align="right" sdval="0." sdnum="2057;0;0.00%"92.98%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"91.23%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"91.23%</td<td align="right" sdval="57" sdnum="2057;"57</td<td align="right" sdval="53" sdnum="2057;"53</td<td align="right" sdval="52" sdnum="2057;"52</td<td align="right" sdval="52" sdnum="2057;"52</td</tr<tr<td height="17" align="left"string::benchfrom</td<td align="right" sdval="0." sdnum="2057;0;0.00%"93.55%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"96.77%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"91.94%</td<td align="right" sdval="62" sdnum="2057;"62</td<td align="right" sdval="58" sdnum="2057;"58</td<td align="right" sdval="60" sdnum="2057;"60</td<td align="right" sdval="57" sdnum="2057;"57</td</tr<tr<td height="17" align="left"string::benchfromstr</td<td align="right" sdval="1" sdnum="2057;0;0.00%"100.00%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"95.16%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"91.94%</td<td align="right" sdval="62" sdnum="2057;"62</td<td align="right" sdval="62" sdnum="2057;"62</td<td align="right" sdval="59" sdnum="2057;"59</td<td align="right" sdval="57" sdnum="2057;"57</td</tr<tr<td height="17" align="left"string::benchpushcharonebyte</td<td align="right" sdval="0." sdnum="2057;0;0.00%"92.28%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"84.85%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"92.30%</td<td align="right" sdval="" sdnum="2057;"</td<td align="right" sdval="" sdnum="2057;"</td<td align="right" sdval="" sdnum="2057;"</td<td align="right" sdval="" sdnum="2057;"</td</tr<tr<td height="17" align="left"string::benchpushchartwobytes</td<td align="right" sdval="0." sdnum="2057;0;0.00%"94.61%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"94.14%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"92.41%</td<td align="right" sdval="" sdnum="2057;"</td<td align="right" sdval="" sdnum="2057;"</td<td align="right" sdval="" sdnum="2057;"</td<td align="right" sdval="" sdnum="2057;"</td</tr<tr<td height="17" align="left"string::benchpushstr</td<td align="right" sdval="0." sdnum="2057;0;0.00%"90.74%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"94.44%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"88.89%</td<td align="right" sdval="54" sdnum="2057;"54</td<td align="right" sdval="49" sdnum="2057;"49</td<td align="right" sdval="51" sdnum="2057;"51</td<td align="right" sdval="48" sdnum="2057;"48</td</tr<tr<td height="17" align="left"string::benchpushstronebyte</td<td align="right" sdval="0." sdnum="2057;0;0.00%"79.88%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"91.96%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"96.21%</td<td align="right" sdval="" sdnum="2057;"</td<td align="right" sdval="" sdnum="2057;"</td<td align="right" sdval="" sdnum="2057;"</td<td align="right" sdval="" sdnum="2057;"</td</tr<tr<td height="17" align="left"string::benchtostring</td<td align="right" sdval="0." sdnum="2057;0;0.00%"95.08%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"95.08%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"93.44%</td<td align="right" sdval="61" sdnum="2057;"61</td<td align="right" sdval="58" sdnum="2057;"58</td<td align="right" sdval="58" sdnum="2057;"58</td<td align="right" sdval="57" sdnum="2057;"57</td</tr<tr<td height="17" align="left"string::benchwithcapacity</td<td align="right" sdval="0." sdnum="2057;0;0.00%"97.14%</td<td align="right" sdval="1" sdnum="2057;0;0.00%"100.00%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"97.14%</td<td align="right" sdval="35" sdnum="2057;"35</td<td align="right" sdval="34" sdnum="2057;"34</td<td align="right" sdval="35" sdnum="2057;"35</td<td align="right" sdval="34" sdnum="2057;"34</td</tr<tr<td height="17" align="left"string::fromutf8lossy100ascii</td<td align="right" sdval="0." sdnum="2057;0;0.00%"93.33%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"106.67%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"106.67%</td<td align="right" sdval="15" sdnum="2057;"15</td<td align="right" sdval="14" sdnum="2057;"14</td<td align="right" sdval="16" sdnum="2057;"16</td<td align="right" sdval="16" sdnum="2057;"16</td</tr<tr<td height="17" align="left"string::fromutf8lossy100invalid</td<td align="right" sdval="0." sdnum="2057;0;0.00%"87.56%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"122.76%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"103.01%</td<td align="right" sdval="1560" sdnum="2057;"1560</td<td align="right" sdval="1366" sdnum="2057;"1366</td<td align="right" sdval="1915" sdnum="2057;"1915</td<td align="right" sdval="1607" sdnum="2057;"1607</td</tr<tr<td height="17" align="left"string::fromutf8lossy100multibyte</td<td align="right" sdval="0." sdnum="2057;0;0.00%"97.10%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"124.64%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"111.59%</td<td align="right" sdval="69" sdnum="2057;"69</td<td align="right" sdval="67" sdnum="2057;"67</td<td align="right" sdval="86" sdnum="2057;"86</td<td align="right" sdval="77" sdnum="2057;"77</td</tr<tr<td height="17" align="left"string::fromutf8lossy_invalid</td<td align="right" sdval="1." sdnum="2057;0;0.00%"105.38%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"109.87%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"103.14%</td<td align="right" sdval="223" sdnum="2057;"223</td<td align="right" sdval="235" sdnum="2057;"235</td<td align="right" sdval="245" sdnum="2057;"245</td<td align="right" sdval="230" sdnum="2057;"230</td</tr<tr<td height="17" align="right"<bAverage of deltas</b</td<td align="right" sdval="1." sdnum="2057;0;0.00%"112.88%</td<td align="right" sdval="1." sdnum="2057;0;0.00%"120.48%</td<td align="right" sdval="0." sdnum="2057;0;0.00%"96.33%</td<td align="left"<br</td<td align="left"<br</td<td align="left"<br</td<td align="left"<br</td</tr</table</deails
Minor update: is still slower than even with LLVM 7 + RFC 2500. See for the microbenchmark
Triage: I tried to reproduce the microbenchmark, but: "multiple candidates for rand" API of rand has changed and I don't know how to update it Both of these are not insurmountable, but I don't have the time right now to do that work. For simplicity's sake, is the benchmark referenced above.
Assembly of literal char version still looks worse:
Yes, that assembly is worse -- it looks like that's mostly down to the iterator of str rather than the direct prefix -- the function here looks pretty good (and comparable with the string version). I think the problem comes down to trying to re-encode the UTF-8 str input to a char isn't something that we can constant fold away, as it's from the unknown input, and LLVM isn't good enough to see that for the it seems like we can just care about the first byte of the encoded str (which is altogether unsurprising, to be honest, since we are comparing essentially u32 with u32, and LLVM has no knowledge that the first byte is all that matters since it doesn't know the encoding here). I wonder if we could get some wins by replacing the to not use the chars iterator but rather the proposal I gave above (re-encoding the char as UTF-8 and then checking if it's a prefix). I don't have time to run benchmarks right now but thought I'd leave it here at least.
I think the actual issue is that nothing is telling LLVM that Overlong encodings are forbidden. With them there are 4 different ways to encode . Adding a few to might help.
Since UTF8 has good slicing properties, we could actually compare the slices whenever we are testing for string vs substring equality (and skip the char boundary check). This seems to improve the assembly for . combined with this seems to generate the desired assembly: I will try something along these lines in the core library ASAP

Discussion:
mod iter; mod num; mod ops; <ins> mod pattern; </ins> mod slice;

<ins> use test::black_box; use test::Bencher; #[bench] fn starts_with_char(b: &mut Bencher) { let text = black_box("kdjsfhlakfhlsghlkvcnljknfqiunvcijqenwodind"); b.iter(|| { for _ in 0..1024 { black_box(text.starts_with('k')); } }) } #[bench] fn starts_with_str(b: &mut Bencher) { let text = black_box("kdjsfhlakfhlsghlkvcnljknfqiunvcijqenwodind"); b.iter(|| { for _ in 0..1024 { black_box(text.starts_with("k")); } }) } #[bench] fn ends_with_char(b: &mut Bencher) { let text = black_box("kdjsfhlakfhlsghlkvcnljknfqiunvcijqenwodind"); b.iter(|| { for _ in 0..1024 { black_box(text.ends_with('k')); } }) } #[bench] fn ends_with_str(b: &mut Bencher) { let text = black_box("kdjsfhlakfhlsghlkvcnljknfqiunvcijqenwodind"); b.iter(|| { for _ in 0..1024 { black_box(text.ends_with("k")); } }) } </ins>

#[inline] fn is_prefix_of(self, haystack: &'a str) -> bool { <del> if let Some(ch) = haystack.chars().next() { self == ch } else { false } </del> <ins> self.encode_utf8(&mut [0u8; 4]).is_prefix_of(haystack) </ins> } #[inline] fn is_suffix_of(self, haystack: &'a str) -> bool where Self::Searcher: ReverseSearcher<'a> { <del> if let Some(ch) = haystack.chars().next_back() { self == ch } else { false } </del> <ins> self.encode_utf8(&mut [0u8; 4]).is_suffix_of(haystack) </ins> } }

/// Checks whether the pattern matches at the front of the haystack #[inline] fn is_prefix_of(self, haystack: &'a str) -> bool { <del> haystack.is_char_boundary(self.len()) && self == &haystack[..self.len()] </del> <ins> haystack.as_bytes().starts_with(self.as_bytes()) </ins> } /// Checks whether the pattern matches at the back of the haystack #[inline] fn is_suffix_of(self, haystack: &'a str) -> bool { <del> self.len() <= haystack.len() && haystack.is_char_boundary(haystack.len() - self.len()) && self == &haystack[haystack.len() - self.len()..] </del> <ins> haystack.as_bytes().ends_with(self.as_bytes()) </ins> } }