Skip to content

Factor out and improve the vectorization of RegexInterpreter.FindFirstChar - #61490

Merged
stephentoub merged 6 commits into
dotnet:mainfrom
stephentoub:factoroutffc4
Nov 17, 2021
Merged

Factor out and improve the vectorization of RegexInterpreter.FindFirstChar#61490
stephentoub merged 6 commits into
dotnet:mainfrom
stephentoub:factoroutffc4

Conversation

@stephentoub

@stephentoubstephentoub commented Nov 12, 2021

Copy link
Copy Markdown
Member

This change started with the "simple" goal of factoring out the FindFirstChar logic from RegexInterpreter and consuming it in SymbolicRegexMatcher. The existing engines use FindFirstChar to quickly skip ahead to the next location that might possibly match, at which point they fall back to analyzing the whole pattern at that location. SymbolicRegexMatcher (used by RegexOptions.NonBacktracking) had its own implementation for this, which it used any time it entered a start state. This required non-trivial additional code to maintain, and there's no good reason it should be separate from the other engines.

However, what started out as a simple change grew due to regressions that resulted from differences in the implementations. In particular, SymbolicRegexMatcher already works off of precomputed equivalence tables for casing, which gives it very different characteristics in this regard from the existing engines. For example, SymbolicRegexMatcher's existing "skip ahead to the next possible match start location" logic already evaluated all the characters that could possibly start a match, which included variations of the same character when using IgnoreCase, but the existing RegexInterpreter logic didn't. That discrepancy then results in a significant IgnoreCase regression for NonBacktracking due to losing the ability to use a vectorized search for the next starting location. We already plan to shift the existing engines over to a plan where all of these equivalences are computed at construction time rather than using ToLower at both construction time and match time, so this PR takes some steps in that direction, doing so for most of ASCII. This has added some temporary cruft, which we'll be able to delete once we fully shift the implementations over (which we should do in the near future).

Another difference was SymbolicRegexMatcher was enabling use of IndexOfAny for up to 5 characters, whereas RegexOptions.Compiled was only doing up to 3 characters, and RegexInterpreter wasn't doing for any number. The PR now uses 5 everywhere.

However, the more characters involved, the more overhead there is to IndexOfAny, and for some inputs, the higher the chances are that IndexOfAny will find a match sooner, which means its overhead compounds more. To help with that, we now not only compute the possible characters that might match at the beginning of the pattern, but also characters that might match at a fixed offset from the beginning of the pattern (e.g. in \d{3}-\d{2}-\d{4}, it will find the '-' at offset 3 and be able to vectorize a search for that and then back off by the relevant distance. That then also means we might end up with multiple sets to choose to search for, and this PR borrows an idea from Rust, which is to use some rough frequency analysis to determine which set should be targeted. It's not perfect, and we can update the texts use to seed the analysis (right now I based it primarily on *.cs files in dotnet/runtime and some Project Gutenberg texts), but it's good enough for these purposes for now.

We'd previously switched to using IndexOf for a case-sensitive prefix string, but still were using Boyer-Moore for case-insensitive. Now that we're able to also vectorize a search for case-insensitive values (right now just ASCII letter, but that'll be fixed soon), we can just get rid of Boyer-Moore entirely. This saves all the costs to do with constructing the Boyer-Moore tables and also avoids having to generate the Boyer-Moore implementations in RegexOptions.Compiled and the source generator.

The casing change also defeated some other optimizations already present. For example, in .NET 5 we added an optimization whereby an alternation like abcef|abcgh would be transformed into abc(?:ef|gh), and that would apply whether case-sensitive or case-insensitive. But by transforming the expression at construction now for case-insensitive into [Aa][Bb][Cc][Ee][Ff]|[Aa][Bb][Cc][Gg][Hh], that optimization was defeated. I've added a new optimization pass for alternations that will detect common prefixes even if they're sets.

The casing change also revealed some cosmetic issues. As part of the change, when we encounter a "multi" (a multi-character string in the pattern), we convert that single case-insensitive RegexNode to instead be one case-sensitive RegexNode per character, with a set for all the equivalent characters that can match. This then defeats some of the nice formatting we had for multis in the source generator, so as part of this change, the source generator has been augmented to output nicer code for concatenations. And because sets like [Ee] are now way more common (since e.g. a case-insensitive 'e' will be transformed into such a set), we also special-case that in both the source generator and RegexOptions.Compiled, to spit out the equivalent of (c | 0x20) == 'e' rather than (c == 'E'| c == 'e').

Along the way, I cleaned up a few things as well, such as passing around a CultureInfo more rather than repeatedly calling CultureInfo.CurrentCulture, using CollectionsMarshal.GetValueRefOrAddDefault on a hot path to do with interning strings in a lookup table, tweaking SymbolicRegexRunnerFactory's Runner to itself be generic to avoid an extra layer of virtual dispatch per operation, and cleaning up code / comments in SymbolicRegexMatcher along the way.

For the most part the purpose of the change wasn't to improve perf, and in fact I was willing to accept some regressions in the name of consolidation. There are a few regressions here, mostly small, and mostly for cases where we're simply paying an overhead for vectorization, e.g. where the current location is fine to match, or where the target character being searched for is very frequent. Overall, though, there are some substantial improvements.

Benchmarks
TypeMethodToolchainPatternOptionsMeanRatioAllocated
Perf_Regex_Industry_SliceSliceCount\main\corerun.exe?IgnoreCase5,919,020,750.00 ns1.00229,137,752 B
Perf_Regex_Industry_SliceSliceCount\pr\corerun.exe?IgnoreCase2,655,622,120.00 ns0.45229,135,392 B
Perf_Regex_Industry_SliceSliceCount\main\corerun.exe?IgnoreCase, Compiled5,980,794,825.00 ns1.00229,135,392 B
Perf_Regex_Industry_SliceSliceCount\pr\corerun.exe?IgnoreCase, Compiled1,709,189,240.00 ns0.29229,135,392 B
Perf_Regex_Industry_SliceSliceCount\main\corerun.exe?IgnoreCase, NonBacktracking6,274,067,325.00 ns1.00229,135,392 B
Perf_Regex_Industry_SliceSliceCount\pr\corerun.exe?IgnoreCase, NonBacktracking2,792,333,450.00 ns0.45229,135,392 B
Perf_Regex_Industry_SliceSliceCount\main\corerun.exe?None3,769,231,500.00 ns1.00114,408,208 B
Perf_Regex_Industry_SliceSliceCount\pr\corerun.exe?None3,714,378,675.00 ns0.99114,408,208 B
Perf_Regex_Industry_SliceSliceCount\main\corerun.exe?Compiled3,706,293,650.00 ns1.00150,863,280 B
Perf_Regex_Industry_SliceSliceCount\pr\corerun.exe?Compiled3,710,450,780.00 ns1.00114,408,160 B
Perf_Regex_Industry_SliceSliceCount\main\corerun.exe?NonBacktracking4,208,438,720.00 ns1.00114,408,208 B
Perf_Regex_Industry_SliceSliceCount\pr\corerun.exe?NonBacktracking3,745,114,350.00 ns0.89114,408,208 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)HolmesNone789,132.09 ns1.0097,138 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)HolmesNone688,469.87 ns0.8797,138 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)HolmesCompiled808,262.69 ns1.0097,138 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)HolmesCompiled417,193.55 ns0.5297,137 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)HolmesNonBacktracking725,918.41 ns1.0097,138 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)HolmesNonBacktracking685,504.44 ns0.9497,140 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)Sher[a-z]+|Hol[a-z]+None6,870,657.12 ns1.00145,019 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)Sher[a-z]+|Hol[a-z]+None4,824,624.36 ns0.70144,990 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)Sher[a-z]+|Hol[a-z]+Compiled2,258,139.88 ns1.00144,984 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)Sher[a-z]+|Hol[a-z]+Compiled825,089.83 ns0.37144,979 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)Sher[a-z]+|Hol[a-z]+NonBacktracking1,890,083.74 ns1.00144,981 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)Sher[a-z]+|Hol[a-z]+NonBacktracking1,388,542.11 ns0.73144,984 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)SherlockNone471,244.46 ns1.0021,217 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)SherlockNone150,869.37 ns0.3221,216 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)SherlockCompiled523,646.53 ns1.0021,218 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)SherlockCompiled99,295.06 ns0.1921,216 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)SherlockNonBacktracking454,725.55 ns1.0021,217 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)SherlockNonBacktracking144,565.38 ns0.3221,217 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)Sherlock HolmesNone400,282.70 ns1.0019,970 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)Sherlock HolmesNone148,763.96 ns0.3719,968 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)Sherlock HolmesCompiled320,484.07 ns1.0019,969 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)Sherlock HolmesCompiled97,347.57 ns0.3019,968 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)Sherlock HolmesNonBacktracking374,497.60 ns1.0019,969 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)Sherlock HolmesNonBacktracking148,935.01 ns0.4019,968 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)Sherlock|Holmes|WatsonNone9,336,569.80 ns1.00135,227 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)Sherlock|Holmes|WatsonNone8,944,893.54 ns0.96135,258 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)Sherlock|Holmes|WatsonCompiled2,388,718.93 ns1.00135,209 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)Sherlock|Holmes|WatsonCompiled1,685,141.16 ns0.71135,205 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)Sherlock|Holmes|WatsonNonBacktracking2,627,173.71 ns1.00135,213 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)Sherlock|Holmes|WatsonNonBacktracking3,059,709.81 ns1.16135,209 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)Sherlock|(...)er|John|Baker [49]None25,380,686.43 ns1.00156,696 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)Sherlock|(...)er|John|Baker [49]None30,027,019.05 ns1.18156,775 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)Sherlock|(...)er|John|Baker [49]Compiled3,858,861.83 ns1.00156,637 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)Sherlock|(...)er|John|Baker [49]Compiled3,112,603.56 ns0.81156,639 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)Sherlock|(...)er|John|Baker [49]NonBacktracking4,290,006.78 ns1.00156,636 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)Sherlock|(...)er|John|Baker [49]NonBacktracking4,113,633.45 ns0.96156,642 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)theNone2,482,717.44 ns1.001,661,303 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)theNone1,693,418.30 ns0.681,661,301 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)theCompiled2,410,350.89 ns1.001,661,305 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)theCompiled1,031,249.35 ns0.431,661,299 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)theNonBacktracking2,272,962.31 ns1.001,661,303 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)theNonBacktracking1,699,628.91 ns0.751,661,301 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?m)^Sherlock(...)rlock Holmes$ [37]None87,770.03 ns1.007,072 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?m)^Sherlock(...)rlock Holmes$ [37]None49,695.90 ns0.577,072 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?m)^Sherlock(...)rlock Holmes$ [37]Compiled52,439.39 ns1.007,072 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?m)^Sherlock(...)rlock Holmes$ [37]Compiled44,650.20 ns0.857,072 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?m)^Sherlock(...)rlock Holmes$ [37]NonBacktracking83,746.07 ns1.0010,097 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?m)^Sherlock(...)rlock Holmes$ [37]NonBacktracking62,438.20 ns0.747,960 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?s).*None3,048,148.21 ns1.00425 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?s).*None2,029,877.99 ns0.67422 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?s).*Compiled137.61 ns1.00416 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?s).*Compiled136.19 ns0.99416 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?s).*NonBacktracking4,272,951.28 ns1.00431 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?s).*NonBacktracking3,870,547.32 ns0.91429 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe.*None2,514,522.64 ns1.005,429,847 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe.*None2,566,864.44 ns1.025,429,851 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe.*Compiled1,961,965.35 ns1.005,429,846 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe.*Compiled1,900,608.07 ns0.975,429,848 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe.*NonBacktracking6,330,598.07 ns1.005,429,859 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe.*NonBacktracking6,582,895.41 ns1.045,429,866 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeHolmesNone99,887.36 ns1.0095,888 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeHolmesNone101,882.18 ns1.0295,888 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeHolmesCompiled88,257.94 ns1.0095,888 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeHolmesCompiled86,498.28 ns0.9895,888 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeHolmesNonBacktracking534,754.92 ns1.0095,890 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeHolmesNonBacktracking119,285.84 ns0.2295,890 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeHolmes.{0,25}(...).{0,25}Holmes [39]None2,292,453.21 ns1.001,463 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeHolmes.{0,25}(...).{0,25}Holmes [39]None359,811.76 ns0.161,457 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeHolmes.{0,25}(...).{0,25}Holmes [39]Compiled134,305.47 ns1.001,456 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeHolmes.{0,25}(...).{0,25}Holmes [39]Compiled132,236.00 ns0.981,456 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeHolmes.{0,25}(...).{0,25}Holmes [39]NonBacktracking208,517.33 ns1.001,457 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeHolmes.{0,25}(...).{0,25}Holmes [39]NonBacktracking204,748.72 ns0.981,457 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSher[a-z]+|Hol[a-z]+None2,160,430.30 ns1.00121,069 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSher[a-z]+|Hol[a-z]+None222,265.19 ns0.10121,060 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSher[a-z]+|Hol[a-z]+Compiled103,542.56 ns1.00121,056 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSher[a-z]+|Hol[a-z]+Compiled106,307.18 ns1.03121,057 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSher[a-z]+|Hol[a-z]+NonBacktracking235,204.99 ns1.00121,060 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSher[a-z]+|Hol[a-z]+NonBacktracking225,376.41 ns0.96121,059 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlockNone50,969.53 ns1.0020,176 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlockNone51,119.21 ns1.0020,176 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlockCompiled48,287.55 ns1.0020,176 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlockCompiled47,980.76 ns0.9920,176 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlockNonBacktracking341,080.91 ns1.0020,177 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlockNonBacktracking57,424.63 ns0.1720,177 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlock HolmesNone51,047.67 ns1.0018,928 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlock HolmesNone53,062.79 ns1.0418,928 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlock HolmesCompiled47,868.40 ns1.0018,928 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlock HolmesCompiled48,583.45 ns1.0218,928 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlock HolmesNonBacktracking272,257.62 ns1.0018,929 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlock HolmesNonBacktracking62,228.65 ns0.2318,929 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlock\s+HolmesNone54,741.68 ns1.0020,176 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlock\s+HolmesNone54,947.28 ns1.0120,176 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlock\s+HolmesCompiled48,400.44 ns1.0020,176 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlock\s+HolmesCompiled48,139.39 ns0.9920,176 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlock\s+HolmesNonBacktracking368,725.29 ns1.0020,177 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlock\s+HolmesNonBacktracking90,658.24 ns0.2520,176 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlock|HolmesNone2,125,098.17 ns1.00116,077 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlock|HolmesNone207,549.09 ns0.10116,065 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlock|HolmesCompiled101,719.84 ns1.00116,064 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlock|HolmesCompiled100,942.91 ns0.99116,064 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlock|HolmesNonBacktracking174,869.17 ns1.00116,064 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlock|HolmesNonBacktracking167,204.46 ns0.96116,064 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlock|Holmes|WatsonNone2,515,241.57 ns1.00132,926 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlock|Holmes|WatsonNone348,264.09 ns0.14132,936 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlock|Holmes|WatsonCompiled140,145.51 ns1.00132,912 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlock|Holmes|WatsonCompiled137,239.30 ns0.98132,912 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlock|Holmes|WatsonNonBacktracking218,512.11 ns1.00132,913 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlock|Holmes|WatsonNonBacktracking220,536.51 ns1.01132,913 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlock|Holm(...)er|John|Baker [45]None3,465,627.05 ns1.00153,932 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlock|Holm(...)er|John|Baker [45]None2,549,994.01 ns0.74153,927 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlock|Holm(...)er|John|Baker [45]Compiled994,995.45 ns1.00153,923 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlock|Holm(...)er|John|Baker [45]Compiled2,082,308.41 ns2.09153,926 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlock|Holm(...)er|John|Baker [45]NonBacktracking1,139,442.03 ns1.00153,923 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlock|Holm(...)er|John|Baker [45]NonBacktracking3,034,334.32 ns2.66153,942 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlock|StreetNone106,161.14 ns1.0032,864 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlock|StreetNone111,006.55 ns1.0532,866 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlock|StreetCompiled60,754.20 ns1.0032,864 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlock|StreetCompiled57,936.28 ns0.9632,864 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlock|StreetNonBacktracking128,014.67 ns1.0032,865 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlock|StreetNonBacktracking112,557.51 ns0.8932,865 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeTheNone126,093.97 ns1.00154,130 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeTheNone122,884.38 ns0.97154,128 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeTheCompiled106,029.27 ns1.00154,128 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeTheCompiled106,163.97 ns1.00154,128 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeTheNonBacktracking1,155,649.71 ns1.00154,131 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeTheNonBacktracking139,228.02 ns0.12154,128 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe[^\n]*None2,629,307.54 ns1.005,429,847 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe[^\n]*None2,561,391.44 ns0.975,429,847 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe[^\n]*Compiled2,028,577.34 ns1.005,429,848 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe[^\n]*Compiled1,990,132.75 ns0.985,429,848 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe[^\n]*NonBacktracking6,431,206.78 ns1.005,429,858 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe[^\n]*NonBacktracking6,572,198.42 ns1.025,429,859 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe[a-q][^u-z]{13}xNone34,370,362.50 ns1.00029,656 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe[a-q][^u-z]{13}xNone78,359.01 ns0.00229,537 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe[a-q][^u-z]{13}xCompiled6,114,925.23 ns1.00029,551 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe[a-q][^u-z]{13}xCompiled48,905.68 ns0.00829,536 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe[a-q][^u-z]{13}xNonBacktracking1,913,033,821.43 ns1.0002,250,206,424 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe[a-q][^u-z]{13}xNonBacktracking99,301.51 ns0.00029,536 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe[a-zA-Z]+ingNone32,224,692.22 ns1.00587,512 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe[a-zA-Z]+ingNone28,495,211.11 ns0.88587,580 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe[a-zA-Z]+ingCompiled5,993,759.29 ns1.00587,409 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe[a-zA-Z]+ingCompiled6,027,973.78 ns1.01587,409 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe[a-zA-Z]+ingNonBacktracking6,064,019.70 ns1.00587,410 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe[a-zA-Z]+ingNonBacktracking7,168,776.00 ns1.18587,413 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\b\w+n\bNone31,108,293.27 ns1.001,740,218 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\b\w+n\bNone29,636,470.54 ns0.951,740,340 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\b\w+n\bCompiled12,133,476.19 ns1.001,740,188 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\b\w+n\bCompiled12,401,181.55 ns1.021,740,188 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\b\w+n\bNonBacktracking8,312,614.44 ns1.002,133,560 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\b\w+n\bNonBacktracking9,244,832.19 ns1.112,097,539 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\p{Ll}None40,255,786.54 ns1.0090,060,020 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\p{Ll}None40,254,686.54 ns1.0090,060,020 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\p{Ll}Compiled29,305,301.48 ns1.0090,059,982 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\p{Ll}Compiled29,034,462.09 ns0.9990,059,920 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\p{Ll}NonBacktracking53,269,781.25 ns1.0090,060,020 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\p{Ll}NonBacktracking56,607,580.00 ns1.0690,060,020 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\p{Lu}None3,570,983.27 ns1.002,949,450 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\p{Lu}None2,730,198.37 ns0.762,949,448 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\p{Lu}Compiled1,474,347.32 ns1.002,949,445 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\p{Lu}Compiled1,494,025.49 ns1.012,949,445 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\p{Lu}NonBacktracking2,618,204.59 ns1.002,949,448 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\p{Lu}NonBacktracking3,088,072.68 ns1.182,949,449 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\p{L}None42,264,292.86 ns1.0093,009,460 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\p{L}None40,989,263.46 ns0.9793,009,460 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\p{L}Compiled29,678,550.83 ns1.0093,009,370 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\p{L}Compiled30,317,169.53 ns1.0293,009,370 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\p{L}NonBacktracking54,779,287.50 ns1.0093,009,642 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\p{L}NonBacktracking55,246,435.42 ns1.0193,009,460 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\s[a-zA-Z]{0,12}ing\sNone20,425,308.15 ns1.00432,928 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\s[a-zA-Z]{0,12}ing\sNone18,277,753.21 ns0.90432,903 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\s[a-zA-Z]{0,12}ing\sCompiled5,618,254.65 ns1.00432,865 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\s[a-zA-Z]{0,12}ing\sCompiled5,636,516.96 ns1.00432,865 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\s[a-zA-Z]{0,12}ing\sNonBacktracking4,998,205.23 ns1.00432,874 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\s[a-zA-Z]{0,12}ing\sNonBacktracking5,263,322.98 ns1.05432,863 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\w+None15,244,954.91 ns1.0022,716,557 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\w+None13,612,713.69 ns0.8922,716,572 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\w+Compiled9,636,018.72 ns1.0022,716,577 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\w+Compiled9,346,380.16 ns0.9722,716,540 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\w+NonBacktracking17,990,034.19 ns1.0022,716,592 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\w+NonBacktracking18,537,428.33 ns1.0322,716,584 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\w+\s+HolmesNone12,565,884.76 ns1.0066,400 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\w+\s+HolmesNone10,438,652.50 ns0.8366,414 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\w+\s+HolmesCompiled3,816,505.65 ns1.0066,365 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\w+\s+HolmesCompiled3,843,176.25 ns1.0166,365 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\w+\s+HolmesNonBacktracking4,129,915.63 ns1.0066,364 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\w+\s+HolmesNonBacktracking4,662,944.47 ns1.1366,366 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\w+\s+Holmes\s+\w+None12,486,528.72 ns1.0028,544 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\w+\s+Holmes\s+\w+None10,461,789.63 ns0.8428,536 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\w+\s+Holmes\s+\w+Compiled3,838,074.88 ns1.0028,509 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\w+\s+Holmes\s+\w+Compiled3,834,882.29 ns1.0028,509 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\w+\s+Holmes\s+\w+NonBacktracking4,330,990.46 ns1.0028,508 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\w+\s+Holmes\s+\w+NonBacktracking4,552,558.88 ns1.0528,509 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeaeiNone754,303.87 ns1.00-
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeaeiNone746,433.99 ns0.99-
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeaeiCompiled761,881.39 ns1.00-
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeaeiCompiled761,182.91 ns1.00-
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeaeiNonBacktracking893,414.74 ns1.00-
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeaeiNonBacktracking759,851.72 ns0.85-
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeaqjNone757,791.11 ns1.00-
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeaqjNone748,552.36 ns0.99-
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeaqjCompiled764,630.14 ns1.00-
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeaqjCompiled770,378.82 ns1.01-
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeaqjNonBacktracking738,393.92 ns1.00-
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeaqjNonBacktracking759,543.77 ns1.03-
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exetheNone1,605,080.76 ns1.001,501,349 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exetheNone1,596,498.16 ns0.991,501,349 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exetheCompiled1,398,260.04 ns1.001,501,348 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exetheCompiled1,383,918.27 ns0.991,501,348 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exetheNonBacktracking1,768,233.07 ns1.001,501,349 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exetheNonBacktracking1,694,861.94 ns0.961,501,349 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exethe\s+\w+None1,964,638.76 ns1.001,125,286 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exethe\s+\w+None1,830,673.79 ns0.931,125,290 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exethe\s+\w+Compiled1,405,604.69 ns1.001,125,284 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exethe\s+\w+Compiled1,408,113.64 ns1.001,125,285 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exethe\s+\w+NonBacktracking2,533,461.30 ns1.001,125,287 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exethe\s+\w+NonBacktracking2,440,085.66 ns0.961,125,287 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exezqjNone25,450.52 ns1.00-
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exezqjNone24,698.79 ns0.95-
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exezqjCompiled24,252.99 ns1.00-
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exezqjCompiled24,192.44 ns1.00-
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exezqjNonBacktracking707,197.50 ns1.00-
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exezqjNonBacktracking24,004.56 ns0.03-
Perf_Regex_Industry_LeipzigCount\main\corerun.exe(?i)Tom|Sawyer|Huckleberry|FinnNone387,378,692.86 ns1.00864,336 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe(?i)Tom|Sawyer|Huckleberry|FinnNone404,665,286.67 ns1.04864,672 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe(?i)Tom|Sawyer|Huckleberry|FinnCompiled95,786,800.00 ns1.00863,976 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe(?i)Tom|Sawyer|Huckleberry|FinnCompiled63,912,610.00 ns0.67863,880 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe(?i)Tom|Sawyer|Huckleberry|FinnNonBacktracking89,497,342.31 ns1.00863,796 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe(?i)Tom|Sawyer|Huckleberry|FinnNonBacktracking88,191,775.00 ns0.99863,880 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe(?i)TwainNone23,718,807.94 ns1.00200,881 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe(?i)TwainNone8,548,322.19 ns0.36200,746 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe(?i)TwainCompiled25,416,325.93 ns1.00200,881 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe(?i)TwainCompiled5,515,463.84 ns0.22200,737 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe(?i)TwainNonBacktracking23,329,646.15 ns1.00200,800 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe(?i)TwainNonBacktracking8,367,159.76 ns0.36200,772 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe([A-Za-z]awyer|[A-Za-z]inn)\sNone1,137,671,226.67 ns1.0052,552 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe([A-Za-z]awyer|[A-Za-z]inn)\sNone902,357,906.67 ns0.7952,552 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe([A-Za-z]awyer|[A-Za-z]inn)\sCompiled66,055,883.33 ns1.0052,012 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe([A-Za-z]awyer|[A-Za-z]inn)\sCompiled13,052,931.58 ns0.2051,870 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe([A-Za-z]awyer|[A-Za-z]inn)\sNonBacktracking147,017,061.54 ns1.0044,192 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe([A-Za-z]awyer|[A-Za-z]inn)\sNonBacktracking20,017,116.03 ns0.1443,532 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe.{0,2}(Tom|Sawyer|Huckleberry|Finn)None4,966,290,107.69 ns1.00645,024 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe.{0,2}(Tom|Sawyer|Huckleberry|Finn)None4,997,197,992.31 ns1.01645,024 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe.{0,2}(Tom|Sawyer|Huckleberry|Finn)Compiled375,813,600.00 ns1.00645,024 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe.{0,2}(Tom|Sawyer|Huckleberry|Finn)Compiled384,090,378.57 ns1.02645,024 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe.{0,2}(Tom|Sawyer|Huckleberry|Finn)NonBacktracking108,437,021.43 ns1.00541,104 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe.{0,2}(Tom|Sawyer|Huckleberry|Finn)NonBacktracking119,278,042.86 ns1.10541,104 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe.{2,4}(Tom|Sawyer|Huckleberry|Finn)None5,029,933,528.57 ns1.00490,768 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe.{2,4}(Tom|Sawyer|Huckleberry|Finn)None4,978,236,685.71 ns0.99490,768 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe.{2,4}(Tom|Sawyer|Huckleberry|Finn)Compiled380,955,615.38 ns1.00491,744 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe.{2,4}(Tom|Sawyer|Huckleberry|Finn)Compiled380,102,400.00 ns1.00491,744 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe.{2,4}(Tom|Sawyer|Huckleberry|Finn)NonBacktracking113,791,356.25 ns1.00411,368 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe.{2,4}(Tom|Sawyer|Huckleberry|Finn)NonBacktracking121,095,275.00 ns1.07411,728 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exeHuck[a-zA-Z]+|Saw[a-zA-Z]+None62,844,185.71 ns1.0054,676 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exeHuck[a-zA-Z]+|Saw[a-zA-Z]+None4,903,562.55 ns0.0854,524 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exeHuck[a-zA-Z]+|Saw[a-zA-Z]+Compiled2,220,262.43 ns1.0054,503 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exeHuck[a-zA-Z]+|Saw[a-zA-Z]+Compiled2,203,296.15 ns0.9954,507 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exeHuck[a-zA-Z]+|Saw[a-zA-Z]+NonBacktracking3,260,074.27 ns1.0054,505 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exeHuck[a-zA-Z]+|Saw[a-zA-Z]+NonBacktracking2,751,910.99 ns0.8454,504 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exeTom.{10,25}river|river.{10,25}TomNone96,995,090.62 ns1.00-
Perf_Regex_Industry_LeipzigCount\pr\corerun.exeTom.{10,25}river|river.{10,25}TomNone49,019,228.57 ns0.51-
Perf_Regex_Industry_LeipzigCount\main\corerun.exeTom.{10,25}river|river.{10,25}TomCompiled12,024,382.00 ns1.00452 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exeTom.{10,25}river|river.{10,25}TomCompiled7,659,925.40 ns0.64433 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exeTom.{10,25}river|river.{10,25}TomNonBacktracking25,348,974.81 ns1.00-
Perf_Regex_Industry_LeipzigCount\pr\corerun.exeTom.{10,25}river|river.{10,25}TomNonBacktracking12,004,805.77 ns0.47452 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exeTom|Sawyer|Huckleberry|FinnNone71,777,953.33 ns1.00540,564 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exeTom|Sawyer|Huckleberry|FinnNone13,551,650.77 ns0.19540,432 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exeTom|Sawyer|Huckleberry|FinnCompiled20,268,520.51 ns1.00540,444 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exeTom|Sawyer|Huckleberry|FinnCompiled4,040,211.15 ns0.20540,397 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exeTom|Sawyer|Huckleberry|FinnNonBacktracking6,005,503.20 ns1.00540,418 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exeTom|Sawyer|Huckleberry|FinnNonBacktracking5,059,554.81 ns0.84540,412 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exeTwainNone2,496,472.08 ns1.00168,695 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exeTwainNone2,472,790.84 ns0.99168,695 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exeTwainCompiled2,455,009.63 ns1.00168,695 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exeTwainCompiled2,462,571.43 ns1.00168,695 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exeTwainNonBacktracking16,403,234.87 ns1.00168,736 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exeTwainNonBacktracking2,527,594.07 ns0.15168,695 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe[a-z]shingNone599,066,058.33 ns1.00321,816 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe[a-z]shingNone10,725,073.60 ns0.02320,351 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe[a-z]shingCompiled147,963,307.69 ns1.00321,040 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe[a-z]shingCompiled7,131,160.83 ns0.05320,337 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe[a-z]shingNonBacktracking145,988,333.33 ns1.00321,040 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe[a-z]shingNonBacktracking10,647,451.24 ns0.07320,351 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe\p{Sm}None59,836,651.67 ns1.0014,532 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe\p{Sm}None37,603,825.51 ns0.6314,455 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe\p{Sm}Compiled11,511,310.10 ns1.0014,378 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe\p{Sm}Compiled11,461,300.96 ns1.0014,378 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe\p{Sm}NonBacktracking22,524,769.70 ns1.0014,417 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe\p{Sm}NonBacktracking33,702,615.48 ns1.5014,455 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe∞|✓None59,780,462.50 ns1.00-
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe∞|✓None1,635,881.41 ns0.03424 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe∞|✓Compiled1,594,729.17 ns1.00421 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe∞|✓Compiled1,581,152.46 ns0.99421 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe∞|✓NonBacktracking1,593,292.99 ns1.00434 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe∞|✓NonBacktracking1,588,459.52 ns1.00421 B
RegexRedux_1RegexRedux_1\main\corerun.exe?None41,553,682.14 ns1.002,969,988 B
RegexRedux_1RegexRedux_1\pr\corerun.exe?None37,636,891.67 ns0.912,997,420 B
RegexRedux_5RegexRedux_5\main\corerun.exe?None28,241,272.14 ns1.002,798,768 B
RegexRedux_5RegexRedux_5\pr\corerun.exe?None25,294,893.33 ns0.902,796,740 B
RegexRedux_5RegexRedux_5\main\corerun.exe?Compiled7,643,919.64 ns1.002,799,742 B
RegexRedux_5RegexRedux_5\pr\corerun.exe?Compiled6,647,241.64 ns0.872,803,373 B
Perf_Regex_Industry_MariomkaCtor\main\corerun.exe[\w.+-]+@[\w.-]+.[\w.-]+None1,802.79 ns1.003,200 B
Perf_Regex_Industry_MariomkaCtor\pr\corerun.exe[\w.+-]+@[\w.-]+.[\w.-]+None1,739.21 ns0.962,776 B
Perf_Regex_Industry_MariomkaCount\main\corerun.exe[\w.+-]+@[\w.-]+.[\w.-]+None95,420,267.86 ns1.0019,496 B
Perf_Regex_Industry_MariomkaCount\pr\corerun.exe[\w.+-]+@[\w.-]+.[\w.-]+None87,752,300.00 ns0.9219,316 B
Perf_Regex_Industry_MariomkaCtor\main\corerun.exe[\w.+-]+@[\w.-]+.[\w.-]+Compiled18,857.49 ns1.0012,656 B
Perf_Regex_Industry_MariomkaCtor\pr\corerun.exe[\w.+-]+@[\w.-]+.[\w.-]+Compiled18,631.30 ns0.9912,184 B
Perf_Regex_Industry_MariomkaCount\main\corerun.exe[\w.+-]+@[\w.-]+.[\w.-]+Compiled43,516,983.33 ns1.0019,256 B
Perf_Regex_Industry_MariomkaCount\pr\corerun.exe[\w.+-]+@[\w.-]+.[\w.-]+Compiled43,390,845.83 ns1.0019,256 B
Perf_Regex_Industry_MariomkaCtor\main\corerun.exe[\w.+-]+@[\w.-]+.[\w.-]+NonBacktracking381,762.44 ns1.00310,025 B
Perf_Regex_Industry_MariomkaCtor\pr\corerun.exe[\w.+-]+@[\w.-]+.[\w.-]+NonBacktracking378,707.92 ns0.99307,937 B
Perf_Regex_Industry_MariomkaCount\main\corerun.exe[\w.+-]+@[\w.-]+.[\w.-]+NonBacktracking58,316,891.67 ns1.0019,316 B
Perf_Regex_Industry_MariomkaCount\pr\corerun.exe[\w.+-]+@[\w.-]+.[\w.-]+NonBacktracking66,558,896.43 ns1.1419,316 B
Perf_Regex_Industry_MariomkaCtor\main\corerun.exe[\w]+://[^/\s(...)?(?:#[^\s]*)? [51]None3,139.49 ns1.004,848 B
Perf_Regex_Industry_MariomkaCtor\pr\corerun.exe[\w]+://[^/\s(...)?(?:#[^\s]*)? [51]None3,039.44 ns0.974,504 B
Perf_Regex_Industry_MariomkaCount\main\corerun.exe[\w]+://[^/\s(...)?(?:#[^\s]*)? [51]None97,749,153.33 ns1.001,102,968 B
Perf_Regex_Industry_MariomkaCount\pr\corerun.exe[\w]+://[^/\s(...)?(?:#[^\s]*)? [51]None85,637,781.67 ns0.881,102,788 B
Perf_Regex_Industry_MariomkaCtor\main\corerun.exe[\w]+://[^/\s(...)?(?:#[^\s]*)? [51]Compiled38,322.31 ns1.0026,617 B
Perf_Regex_Industry_MariomkaCtor\pr\corerun.exe[\w]+://[^/\s(...)?(?:#[^\s]*)? [51]Compiled38,197.63 ns1.0026,224 B
Perf_Regex_Industry_MariomkaCount\main\corerun.exe[\w]+://[^/\s(...)?(?:#[^\s]*)? [51]Compiled46,282,289.29 ns1.001,102,788 B
Perf_Regex_Industry_MariomkaCount\pr\corerun.exe[\w]+://[^/\s(...)?(?:#[^\s]*)? [51]Compiled46,220,502.08 ns1.001,102,788 B
Perf_Regex_Industry_MariomkaCtor\main\corerun.exe[\w]+://[^/\s(...)?(?:#[^\s]*)? [51]NonBacktracking405,126.79 ns1.00343,774 B
Perf_Regex_Industry_MariomkaCtor\pr\corerun.exe[\w]+://[^/\s(...)?(?:#[^\s]*)? [51]NonBacktracking403,840.97 ns1.00341,761 B
Perf_Regex_Industry_MariomkaCount\main\corerun.exe[\w]+://[^/\s(...)?(?:#[^\s]*)? [51]NonBacktracking59,939,631.67 ns1.001,102,788 B
Perf_Regex_Industry_MariomkaCount\pr\corerun.exe[\w]+://[^/\s(...)?(?:#[^\s]*)? [51]NonBacktracking68,354,913.33 ns1.141,102,788 B
Perf_Regex_Industry_MariomkaCtor\main\corerun.exe(?:(?:250-5]?[0-9][0-9]) [87]None6,482.24 ns1.008,080 B
Perf_Regex_Industry_MariomkaCtor\pr\corerun.exe(?:(?:250-5]?[0-9][0-9]) [87]None7,115.57 ns1.108,280 B
Perf_Regex_Industry_MariomkaCount\main\corerun.exe(?:(?:250-5]?[0-9][0-9]) [87]None38,004,650.00 ns1.00-
Perf_Regex_Industry_MariomkaCount\pr\corerun.exe(?:(?:250-5]?[0-9][0-9]) [87]None28,049,133.67 ns0.741,191 B
Perf_Regex_Industry_MariomkaCtor\main\corerun.exe(?:(?:250-5]?[0-9][0-9]) [87]Compiled23,165.01 ns1.0023,208 B
Perf_Regex_Industry_MariomkaCtor\pr\corerun.exe(?:(?:250-5]?[0-9][0-9]) [87]Compiled25,439.48 ns1.1025,056 B
Perf_Regex_Industry_MariomkaCount\main\corerun.exe(?:(?:250-5]?[0-9][0-9]) [87]Compiled6,370,831.99 ns1.001,064 B
Perf_Regex_Industry_MariomkaCount\pr\corerun.exe(?:(?:250-5]?[0-9][0-9]) [87]Compiled6,350,644.31 ns1.001,064 B
Perf_Regex_Industry_MariomkaCtor\main\corerun.exe(?:(?:250-5]?[0-9][0-9]) [87]NonBacktracking87,644.59 ns1.00149,648 B
Perf_Regex_Industry_MariomkaCtor\pr\corerun.exe(?:(?:250-5]?[0-9][0-9]) [87]NonBacktracking86,663.11 ns0.99149,761 B
Perf_Regex_Industry_MariomkaCount\main\corerun.exe(?:(?:250-5]?[0-9][0-9]) [87]NonBacktracking12,839,413.91 ns1.001,078 B
Perf_Regex_Industry_MariomkaCount\pr\corerun.exe(?:(?:250-5]?[0-9][0-9]) [87]NonBacktracking20,377,364.29 ns1.591,172 B
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None62.76 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None65.89 ns1.05-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled40.85 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled40.91 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking60.50 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking87.16 ns1.44-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None161.46 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None154.61 ns0.96-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled73.30 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled74.59 ns1.02-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking687.45 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking795.49 ns1.16-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None271.85 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None246.07 ns0.91-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled97.16 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled102.06 ns1.05-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking178.90 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking215.75 ns1.21-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None455.16 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None385.55 ns0.85-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled140.98 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled141.24 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking246.23 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking272.41 ns1.11-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None378.95 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None308.17 ns0.81-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled123.57 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled123.34 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking173.93 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking184.33 ns1.06-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None379.94 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None340.22 ns0.90-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled125.34 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled125.96 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking193.62 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking212.19 ns1.10-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None128.85 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None116.89 ns0.91-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled42.61 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled43.78 ns1.03-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking128.33 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking135.73 ns1.06-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None125.60 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None116.10 ns0.92-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled42.59 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled42.88 ns1.01-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking105.04 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking111.33 ns1.06-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None125.07 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None117.37 ns0.94-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled41.76 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled43.25 ns1.04-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking111.49 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking127.97 ns1.15-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None134.56 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None112.85 ns0.84-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled40.26 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled40.11 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking131.19 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking137.44 ns1.04-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None135.09 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None116.08 ns0.86-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled41.20 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled41.21 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking141.80 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking158.57 ns1.12-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None97.53 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None90.09 ns0.92-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled38.86 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled38.74 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking85.60 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking89.90 ns1.05-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None125.16 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None111.89 ns0.89-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled44.82 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled44.80 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking139.00 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking149.30 ns1.07-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None124.67 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None111.90 ns0.90-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled44.98 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled44.89 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking138.01 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking150.78 ns1.09-
Perf_Regex_CacheIsMatch\main\corerun.exe??36,280,917.50 ns1.00107,200,120 B
Perf_Regex_CacheIsMatch\pr\corerun.exe??36,889,390.00 ns1.0296,000,120 B
Perf_Regex_CacheIsMatch_Multithreading\main\corerun.exe??12,761,217.00 ns1.00107,201,136 B
Perf_Regex_CacheIsMatch_Multithreading\pr\corerun.exe??13,376,354.51 ns1.0596,001,191 B
Perf_Regex_CacheIsMatch\main\corerun.exe??81,442,280.00 ns1.00167,802,952 B
Perf_Regex_CacheIsMatch\pr\corerun.exe??86,256,273.33 ns1.06156,706,832 B
Perf_Regex_CacheIsMatch_Multithreading\main\corerun.exe??30,305,710.26 ns1.00167,729,155 B
Perf_Regex_CacheIsMatch_Multithreading\pr\corerun.exe??30,574,329.76 ns1.01156,658,415 B
Perf_Regex_CacheIsMatch\main\corerun.exe??69,044,760.00 ns1.0087,588,848 B
Perf_Regex_CacheIsMatch\pr\corerun.exe??70,905,162.50 ns1.0381,324,192 B
Perf_Regex_CacheIsMatch_Multithreading\main\corerun.exe??47,851,511.25 ns1.0087,702,890 B
Perf_Regex_CacheIsMatch_Multithreading\pr\corerun.exe??45,735,085.00 ns0.9681,969,042 B
Perf_Regex_CacheIsMatch\main\corerun.exe??10,561,671.87 ns1.00-
Perf_Regex_CacheIsMatch\pr\corerun.exe??9,933,559.23 ns0.93-
Perf_Regex_CacheIsMatch_Multithreading\main\corerun.exe??3,997,190.25 ns1.0061,736 B
Perf_Regex_CacheIsMatch_Multithreading\pr\corerun.exe??3,979,859.55 ns1.0060,089 B
Perf_Regex_CacheIsMatch\main\corerun.exe??38,446,023.08 ns1.00-
Perf_Regex_CacheIsMatch\pr\corerun.exe??38,502,030.36 ns1.00-
Perf_Regex_CacheIsMatch_Multithreading\main\corerun.exe??35,723,650.00 ns1.0061,161,464 B
Perf_Regex_CacheIsMatch_Multithreading\pr\corerun.exe??35,247,306.48 ns0.9968,409,013 B
Perf_Regex_CacheIsMatch\main\corerun.exe??51,511,911.54 ns1.00-
Perf_Regex_CacheIsMatch\pr\corerun.exe??50,659,253.33 ns0.98-
Perf_Regex_CacheIsMatch_Multithreading\main\corerun.exe??40,094,616.25 ns1.0049,705,372 B
Perf_Regex_CacheIsMatch_Multithreading\pr\corerun.exe??39,284,054.17 ns0.9859,197,761 B
Perf_Regex_CommonBacktracking\main\corerun.exe?Compiled163.01 ns1.00248 B
Perf_Regex_CommonBacktracking\pr\corerun.exe?Compiled162.43 ns1.00248 B
Perf_Regex_CommonOneNodeBacktracking\main\corerun.exe?Compiled832.26 ns1.00-
Perf_Regex_CommonOneNodeBacktracking\pr\corerun.exe?Compiled836.37 ns1.00-
Perf_Regex_CommonEmail_IsMatch\main\corerun.exe?Compiled139.34 ns1.00-
Perf_Regex_CommonEmail_IsMatch\pr\corerun.exe?Compiled138.68 ns1.00-
Perf_Regex_CommonEmail_IsNotMatch\main\corerun.exe?Compiled206.52 ns1.00-
Perf_Regex_CommonEmail_IsNotMatch\pr\corerun.exe?Compiled204.28 ns0.99-
Perf_Regex_CommonDate_IsMatch\main\corerun.exe?Compiled63.72 ns1.00-
Perf_Regex_CommonDate_IsMatch\pr\corerun.exe?Compiled63.68 ns1.00-
Perf_Regex_CommonDate_IsNotMatch\main\corerun.exe?Compiled117.46 ns1.00-
Perf_Regex_CommonDate_IsNotMatch\pr\corerun.exe?Compiled117.10 ns1.00-
Perf_Regex_CommonIP_IsMatch\main\corerun.exe?Compiled175.79 ns1.00-
Perf_Regex_CommonIP_IsMatch\pr\corerun.exe?Compiled170.89 ns0.97-
Perf_Regex_CommonIP_IsNotMatch\main\corerun.exe?Compiled172.14 ns1.00-
Perf_Regex_CommonIP_IsNotMatch\pr\corerun.exe?Compiled169.62 ns0.99-
Perf_Regex_CommonUri_IsMatch\main\corerun.exe?Compiled98.32 ns1.00-
Perf_Regex_CommonUri_IsMatch\pr\corerun.exe?Compiled97.08 ns0.99-
Perf_Regex_CommonUri_IsNotMatch\main\corerun.exe?Compiled111.65 ns1.00-
Perf_Regex_CommonUri_IsNotMatch\pr\corerun.exe?Compiled110.41 ns0.99-
Perf_Regex_CommonMatchesSet\main\corerun.exe?Compiled53,520.11 ns1.006,696 B
Perf_Regex_CommonMatchesSet\pr\corerun.exe?Compiled47,569.43 ns0.896,696 B
Perf_Regex_CommonMatchesBoundary\main\corerun.exe?Compiled57,333.98 ns1.006,696 B
Perf_Regex_CommonMatchesBoundary\pr\corerun.exe?Compiled47,398.43 ns0.836,696 B
Perf_Regex_CommonMatchesWord\main\corerun.exe?Compiled2,394.39 ns1.001,480 B
Perf_Regex_CommonMatchesWord\pr\corerun.exe?Compiled2,402.48 ns1.011,480 B
Perf_Regex_CommonMatchesWords\main\corerun.exe?Compiled6,161.95 ns1.003,504 B
Perf_Regex_CommonMatchesWords\pr\corerun.exe?Compiled2,368.01 ns0.383,504 B
Perf_Regex_CommonMatchWord\main\corerun.exe?Compiled182.13 ns1.00208 B
Perf_Regex_CommonMatchWord\pr\corerun.exe?Compiled111.33 ns0.61208 B
Perf_Regex_CommonReplaceWords\main\corerun.exe?Compiled6,139.28 ns1.006,848 B
Perf_Regex_CommonReplaceWords\pr\corerun.exe?Compiled2,302.15 ns0.386,848 B
Perf_Regex_CommonSplitWords\main\corerun.exe?Compiled6,014.93 ns1.007,432 B
Perf_Regex_CommonSplitWords\pr\corerun.exe?Compiled2,177.28 ns0.367,432 B
Perf_Regex_CommonCtor\main\corerun.exe?Compiled24,304.05 ns1.0027,704 B
Perf_Regex_CommonCtor\pr\corerun.exe?Compiled22,017.27 ns0.9126,192 B
Perf_Regex_CommonCtorInvoke\main\corerun.exe?Compiled117,871.80 ns1.0030,678 B
Perf_Regex_CommonCtorInvoke\pr\corerun.exe?Compiled106,120.75 ns0.9029,068 B
Perf_Regex_CommonBacktracking\main\corerun.exe?IgnoreCase, Compiled338.38 ns1.00248 B
Perf_Regex_CommonBacktracking\pr\corerun.exe?IgnoreCase, Compiled182.80 ns0.54248 B
Perf_Regex_CommonOneNodeBacktracking\main\corerun.exe?IgnoreCase, Compiled1,572.31 ns1.00-
Perf_Regex_CommonOneNodeBacktracking\pr\corerun.exe?IgnoreCase, Compiled1,609.75 ns1.02-
Perf_Regex_CommonEmail_IsMatch\main\corerun.exe?IgnoreCase, Compiled205.08 ns1.00-
Perf_Regex_CommonEmail_IsMatch\pr\corerun.exe?IgnoreCase, Compiled204.21 ns0.99-
Perf_Regex_CommonEmail_IsNotMatch\main\corerun.exe?IgnoreCase, Compiled284.11 ns1.00-
Perf_Regex_CommonEmail_IsNotMatch\pr\corerun.exe?IgnoreCase, Compiled465.74 ns1.64-
Perf_Regex_CommonDate_IsMatch\main\corerun.exe?IgnoreCase, Compiled77.45 ns1.00-
Perf_Regex_CommonDate_IsMatch\pr\corerun.exe?IgnoreCase, Compiled72.86 ns0.94-
Perf_Regex_CommonDate_IsNotMatch\main\corerun.exe?IgnoreCase, Compiled179.35 ns1.00-
Perf_Regex_CommonDate_IsNotMatch\pr\corerun.exe?IgnoreCase, Compiled155.91 ns0.87-
Perf_Regex_CommonIP_IsMatch\main\corerun.exe?IgnoreCase, Compiled288.47 ns1.00-
Perf_Regex_CommonIP_IsMatch\pr\corerun.exe?IgnoreCase, Compiled174.70 ns0.60-
Perf_Regex_CommonIP_IsNotMatch\main\corerun.exe?IgnoreCase, Compiled274.28 ns1.00-
Perf_Regex_CommonIP_IsNotMatch\pr\corerun.exe?IgnoreCase, Compiled175.90 ns0.64-
Perf_Regex_CommonUri_IsMatch\main\corerun.exe?IgnoreCase, Compiled143.39 ns1.00-
Perf_Regex_CommonUri_IsMatch\pr\corerun.exe?IgnoreCase, Compiled142.52 ns0.99-
Perf_Regex_CommonUri_IsNotMatch\main\corerun.exe?IgnoreCase, Compiled190.72 ns1.00-
Perf_Regex_CommonUri_IsNotMatch\pr\corerun.exe?IgnoreCase, Compiled337.76 ns1.77-
Perf_Regex_CommonMatchesSet\main\corerun.exe?IgnoreCase, Compiled102,966.36 ns1.006,696 B
Perf_Regex_CommonMatchesSet\pr\corerun.exe?IgnoreCase, Compiled57,836.41 ns0.566,696 B
Perf_Regex_CommonMatchesBoundary\main\corerun.exe?IgnoreCase, Compiled99,719.82 ns1.006,696 B
Perf_Regex_CommonMatchesBoundary\pr\corerun.exe?IgnoreCase, Compiled58,803.43 ns0.596,696 B
Perf_Regex_CommonMatchesWord\main\corerun.exe?IgnoreCase, Compiled3,296.76 ns1.001,480 B
Perf_Regex_CommonMatchesWord\pr\corerun.exe?IgnoreCase, Compiled1,483.23 ns0.451,480 B
Perf_Regex_CommonMatchesWords\main\corerun.exe?IgnoreCase, Compiled17,183.53 ns1.003,504 B
Perf_Regex_CommonMatchesWords\pr\corerun.exe?IgnoreCase, Compiled3,085.54 ns0.183,504 B
Perf_Regex_CommonMatchWord\main\corerun.exe?IgnoreCase, Compiled408.74 ns1.00208 B
Perf_Regex_CommonMatchWord\pr\corerun.exe?IgnoreCase, Compiled142.45 ns0.35208 B
Perf_Regex_CommonReplaceWords\main\corerun.exe?IgnoreCase, Compiled14,457.45 ns1.006,848 B
Perf_Regex_CommonReplaceWords\pr\corerun.exe?IgnoreCase, Compiled3,074.16 ns0.216,848 B
Perf_Regex_CommonSplitWords\main\corerun.exe?IgnoreCase, Compiled14,659.64 ns1.007,432 B
Perf_Regex_CommonSplitWords\pr\corerun.exe?IgnoreCase, Compiled2,864.13 ns0.207,432 B
Perf_Regex_CommonCtor\main\corerun.exe?IgnoreCase, Compiled30,940.34 ns1.0029,968 B
Perf_Regex_CommonCtor\pr\corerun.exe?IgnoreCase, Compiled30,597.55 ns0.9930,688 B
Perf_Regex_CommonCtorInvoke\main\corerun.exe?IgnoreCase, Compiled168,305.30 ns1.0033,310 B
Perf_Regex_CommonCtorInvoke\pr\corerun.exe?IgnoreCase, Compiled123,219.24 ns0.7334,008 B
Perf_Regex_CommonBacktracking\main\corerun.exe?None1,456.25 ns1.00248 B
Perf_Regex_CommonBacktracking\pr\corerun.exe?None1,426.05 ns0.98248 B
Perf_Regex_CommonOneNodeBacktracking\main\corerun.exe?None5,649.41 ns1.00-
Perf_Regex_CommonOneNodeBacktracking\pr\corerun.exe?None5,528.62 ns0.98-
Perf_Regex_CommonEmail_IsMatch\main\corerun.exe?None447.34 ns1.00-
Perf_Regex_CommonEmail_IsMatch\pr\corerun.exe?None363.43 ns0.81-
Perf_Regex_CommonEmail_IsNotMatch\main\corerun.exe?None731.32 ns1.00-
Perf_Regex_CommonEmail_IsNotMatch\pr\corerun.exe?None683.95 ns0.94-
Perf_Regex_CommonDate_IsMatch\main\corerun.exe?None179.07 ns1.00-
Perf_Regex_CommonDate_IsMatch\pr\corerun.exe?None157.20 ns0.88-
Perf_Regex_CommonDate_IsNotMatch\main\corerun.exe?None408.42 ns1.00-
Perf_Regex_CommonDate_IsNotMatch\pr\corerun.exe?None352.61 ns0.86-
Perf_Regex_CommonIP_IsMatch\main\corerun.exe?None635.05 ns1.00-
Perf_Regex_CommonIP_IsMatch\pr\corerun.exe?None587.15 ns0.92-
Perf_Regex_CommonIP_IsNotMatch\main\corerun.exe?None637.63 ns1.00-
Perf_Regex_CommonIP_IsNotMatch\pr\corerun.exe?None589.94 ns0.93-
Perf_Regex_CommonUri_IsMatch\main\corerun.exe?None290.58 ns1.00-
Perf_Regex_CommonUri_IsMatch\pr\corerun.exe?None252.66 ns0.87-
Perf_Regex_CommonUri_IsNotMatch\main\corerun.exe?None346.54 ns1.00-
Perf_Regex_CommonUri_IsNotMatch\pr\corerun.exe?None293.83 ns0.85-
Perf_Regex_CommonMatchesSet\main\corerun.exe?None179,077.37 ns1.006,697 B
Perf_Regex_CommonMatchesSet\pr\corerun.exe?None132,097.01 ns0.746,696 B
Perf_Regex_CommonMatchesBoundary\main\corerun.exe?None135,424.94 ns1.006,696 B
Perf_Regex_CommonMatchesBoundary\pr\corerun.exe?None113,965.33 ns0.846,697 B
Perf_Regex_CommonMatchesWord\main\corerun.exe?None2,593.70 ns1.001,480 B
Perf_Regex_CommonMatchesWord\pr\corerun.exe?None2,590.69 ns1.001,480 B
Perf_Regex_CommonMatchesWords\main\corerun.exe?None65,701.25 ns1.003,504 B
Perf_Regex_CommonMatchesWords\pr\corerun.exe?None51,628.86 ns0.783,504 B
Perf_Regex_CommonMatchWord\main\corerun.exe?None1,680.69 ns1.00208 B
Perf_Regex_CommonMatchWord\pr\corerun.exe?None1,369.82 ns0.82208 B
Perf_Regex_CommonReplaceWords\main\corerun.exe?None65,371.10 ns1.006,849 B
Perf_Regex_CommonReplaceWords\pr\corerun.exe?None53,501.68 ns0.816,848 B
Perf_Regex_CommonSplitWords\main\corerun.exe?None66,615.21 ns1.007,433 B
Perf_Regex_CommonSplitWords\pr\corerun.exe?None50,404.24 ns0.767,432 B
Perf_Regex_CommonCtor\main\corerun.exe?None5,296.62 ns1.007,552 B
Perf_Regex_CommonCtor\pr\corerun.exe?None4,813.12 ns0.916,744 B
Perf_Regex_CommonCtorInvoke\main\corerun.exe?None5,270.26 ns1.007,696 B
Perf_Regex_CommonCtorInvoke\pr\corerun.exe?None4,784.73 ns0.916,880 B

@ghost

Copy link
Copy Markdown

Tagging subscribers to this area: @eerhardt, @dotnet/area-system-text-regularexpressions
See info in area-owners.md if you want to be subscribed.

Issue Details

This change started with the "simple" goal of factoring out the FindFirstChar logic from RegexInterpreter and consuming it in SymbolicRegexMatcher. The existing engines use FindFirstChar to quickly skip ahead to the next location that might possibly match, at which point they fall back to analyzing the whole pattern at that location. SymbolicRegexMatcher (used by RegexOptions.NonBacktracking) had its own implementation for this, which it used any time it entered a start state. This required non-trivial additional code to maintain, and there's no good reason it should be separate from the other engines.

However, what started out as a simple change grew due to regressions that resulted from differences in the implementations. In particular, SymbolicRegexMatcher already works off of precomputed equivalence tables for casing, which gives it very different characteristics in this regard from the existing engines. For example, SymbolicRegexMatcher's existing "skip ahead to the next possible match start location" logic already evaluated all the characters that could possibly start a match, which included variations of the same character when using IgnoreCase, but the existing RegexInterpreter logic didn't. That discrepancy then results in a significant IgnoreCase regression for NonBacktracking due to losing the ability to use a vectorized search for the next starting location. We already plan to shift the existing engines over to a plan where all of these equivalences are computed at construction time rather than using ToLower at both construction time and match time, so this PR takes some steps in that direction, doing so for most of ASCII. This has added some temporary cruft, which we'll be able to delete once we fully shift the implementations over (which we should do in the near future).

Another difference was SymbolicRegexMatcher was enabling use of IndexOfAny for up to 5 characters, whereas RegexOptions.Compiled was only doing up to 3 characters, and RegexInterpreter wasn't doing for any number. The PR now uses 5 everywhere.

However, the more characters involved, the more overhead there is to IndexOfAny, and for some inputs, the higher the chances are that IndexOfAny will find a match sooner, which means its overhead compounds more. To help with that, we now not only compute the possible characters that might match at the beginning of the pattern, but also characters that might match at a fixed offset from the beginning of the pattern (e.g. in \d{3}-\d{2}-\d{4}, it will find the '-' at offset 3 and be able to vectorize a search for that and then back off by the relevant distance. That then also means we might end up with multiple sets to choose to search for, and this PR borrows an idea from Rust, which is to use some rough frequency analysis to determine which set should be targeted. It's not perfect, and we can update the texts use to seed the analysis (right now I based it primarily on *.cs files in dotnet/runtime and some Project Gutenberg texts), but it's good enough for these purposes for now.

We'd previously switched to using IndexOf for a case-sensitive prefix string, but still were using Boyer-Moore for case-insensitive. Now that we're able to also vectorize a search for case-insensitive values (right now just ASCII letter, but that'll be fixed soon), we can just get rid of Boyer-Moore entirely. This saves all the costs to do with constructing the Boyer-Moore tables and also avoids having to generate the Boyer-Moore implementations in RegexOptions.Compiled and the source generator.

The casing change also defeated some other optimizations already present. For example, in .NET 5 we added an optimization whereby an alternation like abcef|abcgh would be transformed into abc(?:ef|gh), and that would apply whether case-sensitive or case-insensitive. But by transforming the expression at construction now for case-insensitive into [Aa][Bb][Cc][Ee][Ff]|[Aa][Bb][Cc][Gg][Hh], that optimization was defeated. I've added a new optimization pass for alternations that will detect common prefixes even if they're sets.

The casing change also revealed some cosmetic issues. As part of the change, when we encounter a "multi" (a multi-character string in the pattern), we convert that single case-insensitive RegexNode to instead be one case-sensitive RegexNode per character, with a set for all the equivalent characters that can match. This then defeats some of the nice formatting we had for multis in the source generator, so as part of this change, the source generator has been augmented to output nicer code for concatenations. And because sets like [Ee] are now way more common (since e.g. a case-insensitive 'e' will be transformed into such a set), we also special-case that in both the source generator and RegexOptions.Compiled, to spit out the equivalent of (c | 0x20) == 'e' rather than (c == 'E'| c == 'e').

Along the way, I cleaned up a few things as well, such as passing around a CultureInfo more rather than repeatedly calling CultureInfo.CurrentCulture, using CollectionsMarshal.GetValueRefOrAddDefault on a hot path to do with interning strings in a lookup table, tweaking SymbolicRegexRunnerFactory's Runner to itself be generic to avoid an extra layer of virtual dispatch per operation, and cleaning up code / comments in SymbolicRegexMatcher along the way.

For the most part the purpose of the change wasn't to improve perf, and in fact I was willing to accept some regressions in the name of consolidation. There are a few regressions here, mostly small, and mostly for cases where we're simply paying an overhead for vectorization, e.g. where the current location is fine to match, or where the target character being searched for is very frequent. Overall, though, there are some substantial improvements.

TypeMethodToolchainPatternOptionsMeanRatioAllocated
Perf_Regex_Industry_SliceSliceCount\main\corerun.exe?IgnoreCase5,919,020,750.00 ns1.00229,137,752 B
Perf_Regex_Industry_SliceSliceCount\pr\corerun.exe?IgnoreCase2,655,622,120.00 ns0.45229,135,392 B
Perf_Regex_Industry_SliceSliceCount\main\corerun.exe?IgnoreCase, Compiled5,980,794,825.00 ns1.00229,135,392 B
Perf_Regex_Industry_SliceSliceCount\pr\corerun.exe?IgnoreCase, Compiled1,709,189,240.00 ns0.29229,135,392 B
Perf_Regex_Industry_SliceSliceCount\main\corerun.exe?IgnoreCase, NonBacktracking6,274,067,325.00 ns1.00229,135,392 B
Perf_Regex_Industry_SliceSliceCount\pr\corerun.exe?IgnoreCase, NonBacktracking2,792,333,450.00 ns0.45229,135,392 B
Perf_Regex_Industry_SliceSliceCount\main\corerun.exe?None3,769,231,500.00 ns1.00114,408,208 B
Perf_Regex_Industry_SliceSliceCount\pr\corerun.exe?None3,714,378,675.00 ns0.99114,408,208 B
Perf_Regex_Industry_SliceSliceCount\main\corerun.exe?Compiled3,706,293,650.00 ns1.00150,863,280 B
Perf_Regex_Industry_SliceSliceCount\pr\corerun.exe?Compiled3,710,450,780.00 ns1.00114,408,160 B
Perf_Regex_Industry_SliceSliceCount\main\corerun.exe?NonBacktracking4,208,438,720.00 ns1.00114,408,208 B
Perf_Regex_Industry_SliceSliceCount\pr\corerun.exe?NonBacktracking3,745,114,350.00 ns0.89114,408,208 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)HolmesNone789,132.09 ns1.0097,138 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)HolmesNone688,469.87 ns0.8797,138 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)HolmesCompiled808,262.69 ns1.0097,138 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)HolmesCompiled417,193.55 ns0.5297,137 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)HolmesNonBacktracking725,918.41 ns1.0097,138 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)HolmesNonBacktracking685,504.44 ns0.9497,140 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)Sher[a-z]+Hol[a-z]+None6,870,657.12 ns1.00
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)Sher[a-z]+Hol[a-z]+None4,824,624.36 ns0.70
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)Sher[a-z]+Hol[a-z]+Compiled2,258,139.88 ns1.00
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)Sher[a-z]+Hol[a-z]+Compiled825,089.83 ns0.37
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)Sher[a-z]+Hol[a-z]+NonBacktracking1,890,083.74 ns1.00
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)Sher[a-z]+Hol[a-z]+NonBacktracking1,388,542.11 ns0.73
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)SherlockNone471,244.46 ns1.0021,217 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)SherlockNone150,869.37 ns0.3221,216 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)SherlockCompiled523,646.53 ns1.0021,218 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)SherlockCompiled99,295.06 ns0.1921,216 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)SherlockNonBacktracking454,725.55 ns1.0021,217 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)SherlockNonBacktracking144,565.38 ns0.3221,217 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)Sherlock HolmesNone400,282.70 ns1.0019,970 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)Sherlock HolmesNone148,763.96 ns0.3719,968 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)Sherlock HolmesCompiled320,484.07 ns1.0019,969 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)Sherlock HolmesCompiled97,347.57 ns0.3019,968 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)Sherlock HolmesNonBacktracking374,497.60 ns1.0019,969 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)Sherlock HolmesNonBacktracking148,935.01 ns0.4019,968 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)SherlockHolmesWatsonNone9,336,569.80 ns
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)SherlockHolmesWatsonNone8,944,893.54 ns
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)SherlockHolmesWatsonCompiled2,388,718.93 ns
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)SherlockHolmesWatsonCompiled1,685,141.16 ns
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)SherlockHolmesWatsonNonBacktracking2,627,173.71 ns
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)SherlockHolmesWatsonNonBacktracking3,059,709.81 ns
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)Sherlock(...)erJohnBaker [49]None
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)Sherlock(...)erJohnBaker [49]None
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)Sherlock(...)erJohnBaker [49]Compiled
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)Sherlock(...)erJohnBaker [49]Compiled
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)Sherlock(...)erJohnBaker [49]NonBacktracking
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)Sherlock(...)erJohnBaker [49]NonBacktracking
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)theNone2,482,717.44 ns1.001,661,303 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)theNone1,693,418.30 ns0.681,661,301 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)theCompiled2,410,350.89 ns1.001,661,305 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)theCompiled1,031,249.35 ns0.431,661,299 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?i)theNonBacktracking2,272,962.31 ns1.001,661,303 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?i)theNonBacktracking1,699,628.91 ns0.751,661,301 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?m)^Sherlock(...)rlock Holmes$ [37]None87,770.03 ns1.007,072 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?m)^Sherlock(...)rlock Holmes$ [37]None49,695.90 ns0.577,072 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?m)^Sherlock(...)rlock Holmes$ [37]Compiled52,439.39 ns1.007,072 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?m)^Sherlock(...)rlock Holmes$ [37]Compiled44,650.20 ns0.857,072 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?m)^Sherlock(...)rlock Holmes$ [37]NonBacktracking83,746.07 ns1.0010,097 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?m)^Sherlock(...)rlock Holmes$ [37]NonBacktracking62,438.20 ns0.747,960 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?s).*None3,048,148.21 ns1.00425 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?s).*None2,029,877.99 ns0.67422 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?s).*Compiled137.61 ns1.00416 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?s).*Compiled136.19 ns0.99416 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe(?s).*NonBacktracking4,272,951.28 ns1.00431 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe(?s).*NonBacktracking3,870,547.32 ns0.91429 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe.*None2,514,522.64 ns1.005,429,847 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe.*None2,566,864.44 ns1.025,429,851 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe.*Compiled1,961,965.35 ns1.005,429,846 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe.*Compiled1,900,608.07 ns0.975,429,848 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe.*NonBacktracking6,330,598.07 ns1.005,429,859 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe.*NonBacktracking6,582,895.41 ns1.045,429,866 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeHolmesNone99,887.36 ns1.0095,888 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeHolmesNone101,882.18 ns1.0295,888 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeHolmesCompiled88,257.94 ns1.0095,888 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeHolmesCompiled86,498.28 ns0.9895,888 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeHolmesNonBacktracking534,754.92 ns1.0095,890 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeHolmesNonBacktracking119,285.84 ns0.2295,890 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeHolmes.{0,25}(...).{0,25}Holmes [39]None2,292,453.21 ns1.001,463 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeHolmes.{0,25}(...).{0,25}Holmes [39]None359,811.76 ns0.161,457 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeHolmes.{0,25}(...).{0,25}Holmes [39]Compiled134,305.47 ns1.001,456 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeHolmes.{0,25}(...).{0,25}Holmes [39]Compiled132,236.00 ns0.981,456 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeHolmes.{0,25}(...).{0,25}Holmes [39]NonBacktracking208,517.33 ns1.001,457 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeHolmes.{0,25}(...).{0,25}Holmes [39]NonBacktracking204,748.72 ns0.981,457 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSher[a-z]+Hol[a-z]+None2,160,430.30 ns1.00
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSher[a-z]+Hol[a-z]+None222,265.19 ns0.10
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSher[a-z]+Hol[a-z]+Compiled103,542.56 ns1.00
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSher[a-z]+Hol[a-z]+Compiled106,307.18 ns1.03
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSher[a-z]+Hol[a-z]+NonBacktracking235,204.99 ns1.00
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSher[a-z]+Hol[a-z]+NonBacktracking225,376.41 ns0.96
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlockNone50,969.53 ns1.0020,176 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlockNone51,119.21 ns1.0020,176 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlockCompiled48,287.55 ns1.0020,176 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlockCompiled47,980.76 ns0.9920,176 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlockNonBacktracking341,080.91 ns1.0020,177 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlockNonBacktracking57,424.63 ns0.1720,177 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlock HolmesNone51,047.67 ns1.0018,928 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlock HolmesNone53,062.79 ns1.0418,928 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlock HolmesCompiled47,868.40 ns1.0018,928 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlock HolmesCompiled48,583.45 ns1.0218,928 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlock HolmesNonBacktracking272,257.62 ns1.0018,929 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlock HolmesNonBacktracking62,228.65 ns0.2318,929 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlock\s+HolmesNone54,741.68 ns1.0020,176 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlock\s+HolmesNone54,947.28 ns1.0120,176 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlock\s+HolmesCompiled48,400.44 ns1.0020,176 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlock\s+HolmesCompiled48,139.39 ns0.9920,176 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlock\s+HolmesNonBacktracking368,725.29 ns1.0020,177 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlock\s+HolmesNonBacktracking90,658.24 ns0.2520,176 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlockHolmesNone2,125,098.17 ns1.00
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlockHolmesNone207,549.09 ns0.10
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlockHolmesCompiled101,719.84 ns1.00
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlockHolmesCompiled100,942.91 ns0.99
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlockHolmesNonBacktracking174,869.17 ns1.00
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlockHolmesNonBacktracking167,204.46 ns0.96
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlockHolmesWatsonNone2,515,241.57 ns
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlockHolmesWatsonNone348,264.09 ns
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlockHolmesWatsonCompiled140,145.51 ns
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlockHolmesWatsonCompiled137,239.30 ns
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlockHolmesWatsonNonBacktracking218,512.11 ns
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlockHolmesWatsonNonBacktracking220,536.51 ns
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlockHolm(...)erJohnBaker [45]None
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlockHolm(...)erJohnBaker [45]None
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlockHolm(...)erJohnBaker [45]Compiled
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlockHolm(...)erJohnBaker [45]Compiled
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlockHolm(...)erJohnBaker [45]NonBacktracking
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlockHolm(...)erJohnBaker [45]NonBacktracking
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlockStreetNone106,161.14 ns1.00
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlockStreetNone111,006.55 ns1.05
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlockStreetCompiled60,754.20 ns1.00
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlockStreetCompiled57,936.28 ns0.96
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeSherlockStreetNonBacktracking128,014.67 ns1.00
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeSherlockStreetNonBacktracking112,557.51 ns0.89
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeTheNone126,093.97 ns1.00154,130 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeTheNone122,884.38 ns0.97154,128 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeTheCompiled106,029.27 ns1.00154,128 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeTheCompiled106,163.97 ns1.00154,128 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeTheNonBacktracking1,155,649.71 ns1.00154,131 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeTheNonBacktracking139,228.02 ns0.12154,128 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe[^\n]*None2,629,307.54 ns1.005,429,847 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe[^\n]*None2,561,391.44 ns0.975,429,847 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe[^\n]*Compiled2,028,577.34 ns1.005,429,848 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe[^\n]*Compiled1,990,132.75 ns0.985,429,848 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe[^\n]*NonBacktracking6,431,206.78 ns1.005,429,858 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe[^\n]*NonBacktracking6,572,198.42 ns1.025,429,859 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe[a-q][^u-z]{13}xNone34,370,362.50 ns1.00029,656 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe[a-q][^u-z]{13}xNone78,359.01 ns0.00229,537 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe[a-q][^u-z]{13}xCompiled6,114,925.23 ns1.00029,551 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe[a-q][^u-z]{13}xCompiled48,905.68 ns0.00829,536 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe[a-q][^u-z]{13}xNonBacktracking1,913,033,821.43 ns1.0002,250,206,424 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe[a-q][^u-z]{13}xNonBacktracking99,301.51 ns0.00029,536 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe[a-zA-Z]+ingNone32,224,692.22 ns1.00587,512 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe[a-zA-Z]+ingNone28,495,211.11 ns0.88587,580 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe[a-zA-Z]+ingCompiled5,993,759.29 ns1.00587,409 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe[a-zA-Z]+ingCompiled6,027,973.78 ns1.01587,409 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe[a-zA-Z]+ingNonBacktracking6,064,019.70 ns1.00587,410 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe[a-zA-Z]+ingNonBacktracking7,168,776.00 ns1.18587,413 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\b\w+n\bNone31,108,293.27 ns1.001,740,218 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\b\w+n\bNone29,636,470.54 ns0.951,740,340 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\b\w+n\bCompiled12,133,476.19 ns1.001,740,188 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\b\w+n\bCompiled12,401,181.55 ns1.021,740,188 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\b\w+n\bNonBacktracking8,312,614.44 ns1.002,133,560 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\b\w+n\bNonBacktracking9,244,832.19 ns1.112,097,539 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\p{Ll}None40,255,786.54 ns1.0090,060,020 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\p{Ll}None40,254,686.54 ns1.0090,060,020 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\p{Ll}Compiled29,305,301.48 ns1.0090,059,982 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\p{Ll}Compiled29,034,462.09 ns0.9990,059,920 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\p{Ll}NonBacktracking53,269,781.25 ns1.0090,060,020 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\p{Ll}NonBacktracking56,607,580.00 ns1.0690,060,020 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\p{Lu}None3,570,983.27 ns1.002,949,450 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\p{Lu}None2,730,198.37 ns0.762,949,448 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\p{Lu}Compiled1,474,347.32 ns1.002,949,445 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\p{Lu}Compiled1,494,025.49 ns1.012,949,445 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\p{Lu}NonBacktracking2,618,204.59 ns1.002,949,448 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\p{Lu}NonBacktracking3,088,072.68 ns1.182,949,449 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\p{L}None42,264,292.86 ns1.0093,009,460 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\p{L}None40,989,263.46 ns0.9793,009,460 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\p{L}Compiled29,678,550.83 ns1.0093,009,370 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\p{L}Compiled30,317,169.53 ns1.0293,009,370 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\p{L}NonBacktracking54,779,287.50 ns1.0093,009,642 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\p{L}NonBacktracking55,246,435.42 ns1.0193,009,460 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\s[a-zA-Z]{0,12}ing\sNone20,425,308.15 ns1.00432,928 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\s[a-zA-Z]{0,12}ing\sNone18,277,753.21 ns0.90432,903 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\s[a-zA-Z]{0,12}ing\sCompiled5,618,254.65 ns1.00432,865 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\s[a-zA-Z]{0,12}ing\sCompiled5,636,516.96 ns1.00432,865 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\s[a-zA-Z]{0,12}ing\sNonBacktracking4,998,205.23 ns1.00432,874 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\s[a-zA-Z]{0,12}ing\sNonBacktracking5,263,322.98 ns1.05432,863 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\w+None15,244,954.91 ns1.0022,716,557 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\w+None13,612,713.69 ns0.8922,716,572 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\w+Compiled9,636,018.72 ns1.0022,716,577 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\w+Compiled9,346,380.16 ns0.9722,716,540 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\w+NonBacktracking17,990,034.19 ns1.0022,716,592 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\w+NonBacktracking18,537,428.33 ns1.0322,716,584 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\w+\s+HolmesNone12,565,884.76 ns1.0066,400 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\w+\s+HolmesNone10,438,652.50 ns0.8366,414 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\w+\s+HolmesCompiled3,816,505.65 ns1.0066,365 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\w+\s+HolmesCompiled3,843,176.25 ns1.0166,365 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\w+\s+HolmesNonBacktracking4,129,915.63 ns1.0066,364 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\w+\s+HolmesNonBacktracking4,662,944.47 ns1.1366,366 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\w+\s+Holmes\s+\w+None12,486,528.72 ns1.0028,544 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\w+\s+Holmes\s+\w+None10,461,789.63 ns0.8428,536 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\w+\s+Holmes\s+\w+Compiled3,838,074.88 ns1.0028,509 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\w+\s+Holmes\s+\w+Compiled3,834,882.29 ns1.0028,509 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe\w+\s+Holmes\s+\w+NonBacktracking4,330,990.46 ns1.0028,508 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe\w+\s+Holmes\s+\w+NonBacktracking4,552,558.88 ns1.0528,509 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeaeiNone754,303.87 ns1.00-
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeaeiNone746,433.99 ns0.99-
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeaeiCompiled761,881.39 ns1.00-
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeaeiCompiled761,182.91 ns1.00-
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeaeiNonBacktracking893,414.74 ns1.00-
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeaeiNonBacktracking759,851.72 ns0.85-
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeaqjNone757,791.11 ns1.00-
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeaqjNone748,552.36 ns0.99-
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeaqjCompiled764,630.14 ns1.00-
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeaqjCompiled770,378.82 ns1.01-
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exeaqjNonBacktracking738,393.92 ns1.00-
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exeaqjNonBacktracking759,543.77 ns1.03-
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exetheNone1,605,080.76 ns1.001,501,349 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exetheNone1,596,498.16 ns0.991,501,349 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exetheCompiled1,398,260.04 ns1.001,501,348 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exetheCompiled1,383,918.27 ns0.991,501,348 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exetheNonBacktracking1,768,233.07 ns1.001,501,349 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exetheNonBacktracking1,694,861.94 ns0.961,501,349 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exethe\s+\w+None1,964,638.76 ns1.001,125,286 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exethe\s+\w+None1,830,673.79 ns0.931,125,290 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exethe\s+\w+Compiled1,405,604.69 ns1.001,125,284 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exethe\s+\w+Compiled1,408,113.64 ns1.001,125,285 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exethe\s+\w+NonBacktracking2,533,461.30 ns1.001,125,287 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exethe\s+\w+NonBacktracking2,440,085.66 ns0.961,125,287 B
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exezqjNone25,450.52 ns1.00-
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exezqjNone24,698.79 ns0.95-
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exezqjCompiled24,252.99 ns1.00-
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exezqjCompiled24,192.44 ns1.00-
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exezqjNonBacktracking707,197.50 ns1.00-
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exezqjNonBacktracking24,004.56 ns0.03-
Perf_Regex_Industry_LeipzigCount\main\corerun.exe(?i)TomSawyerHuckleberryFinnNone
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe(?i)TomSawyerHuckleberryFinnNone
Perf_Regex_Industry_LeipzigCount\main\corerun.exe(?i)TomSawyerHuckleberryFinnCompiled
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe(?i)TomSawyerHuckleberryFinnCompiled
Perf_Regex_Industry_LeipzigCount\main\corerun.exe(?i)TomSawyerHuckleberryFinnNonBacktracking
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe(?i)TomSawyerHuckleberryFinnNonBacktracking
Perf_Regex_Industry_LeipzigCount\main\corerun.exe(?i)TwainNone23,718,807.94 ns1.00200,881 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe(?i)TwainNone8,548,322.19 ns0.36200,746 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe(?i)TwainCompiled25,416,325.93 ns1.00200,881 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe(?i)TwainCompiled5,515,463.84 ns0.22200,737 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe(?i)TwainNonBacktracking23,329,646.15 ns1.00200,800 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe(?i)TwainNonBacktracking8,367,159.76 ns0.36200,772 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe([A-Za-z]awyer[A-Za-z]inn)\sNone1,137,671,226.67 ns1.00
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe([A-Za-z]awyer[A-Za-z]inn)\sNone902,357,906.67 ns0.79
Perf_Regex_Industry_LeipzigCount\main\corerun.exe([A-Za-z]awyer[A-Za-z]inn)\sCompiled66,055,883.33 ns1.00
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe([A-Za-z]awyer[A-Za-z]inn)\sCompiled13,052,931.58 ns0.20
Perf_Regex_Industry_LeipzigCount\main\corerun.exe([A-Za-z]awyer[A-Za-z]inn)\sNonBacktracking147,017,061.54 ns1.00
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe([A-Za-z]awyer[A-Za-z]inn)\sNonBacktracking20,017,116.03 ns0.14
Perf_Regex_Industry_LeipzigCount\main\corerun.exe.{0,2}(TomSawyerHuckleberryFinn)None
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe.{0,2}(TomSawyerHuckleberryFinn)None
Perf_Regex_Industry_LeipzigCount\main\corerun.exe.{0,2}(TomSawyerHuckleberryFinn)Compiled
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe.{0,2}(TomSawyerHuckleberryFinn)Compiled
Perf_Regex_Industry_LeipzigCount\main\corerun.exe.{0,2}(TomSawyerHuckleberryFinn)NonBacktracking
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe.{0,2}(TomSawyerHuckleberryFinn)NonBacktracking
Perf_Regex_Industry_LeipzigCount\main\corerun.exe.{2,4}(TomSawyerHuckleberryFinn)None
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe.{2,4}(TomSawyerHuckleberryFinn)None
Perf_Regex_Industry_LeipzigCount\main\corerun.exe.{2,4}(TomSawyerHuckleberryFinn)Compiled
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe.{2,4}(TomSawyerHuckleberryFinn)Compiled
Perf_Regex_Industry_LeipzigCount\main\corerun.exe.{2,4}(TomSawyerHuckleberryFinn)NonBacktracking
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe.{2,4}(TomSawyerHuckleberryFinn)NonBacktracking
Perf_Regex_Industry_LeipzigCount\main\corerun.exeHuck[a-zA-Z]+Saw[a-zA-Z]+None62,844,185.71 ns1.00
Perf_Regex_Industry_LeipzigCount\pr\corerun.exeHuck[a-zA-Z]+Saw[a-zA-Z]+None4,903,562.55 ns0.08
Perf_Regex_Industry_LeipzigCount\main\corerun.exeHuck[a-zA-Z]+Saw[a-zA-Z]+Compiled2,220,262.43 ns1.00
Perf_Regex_Industry_LeipzigCount\pr\corerun.exeHuck[a-zA-Z]+Saw[a-zA-Z]+Compiled2,203,296.15 ns0.99
Perf_Regex_Industry_LeipzigCount\main\corerun.exeHuck[a-zA-Z]+Saw[a-zA-Z]+NonBacktracking3,260,074.27 ns1.00
Perf_Regex_Industry_LeipzigCount\pr\corerun.exeHuck[a-zA-Z]+Saw[a-zA-Z]+NonBacktracking2,751,910.99 ns0.84
Perf_Regex_Industry_LeipzigCount\main\corerun.exeTom.{10,25}riverriver.{10,25}TomNone96,995,090.62 ns1.00
Perf_Regex_Industry_LeipzigCount\pr\corerun.exeTom.{10,25}riverriver.{10,25}TomNone49,019,228.57 ns0.51
Perf_Regex_Industry_LeipzigCount\main\corerun.exeTom.{10,25}riverriver.{10,25}TomCompiled12,024,382.00 ns1.00
Perf_Regex_Industry_LeipzigCount\pr\corerun.exeTom.{10,25}riverriver.{10,25}TomCompiled7,659,925.40 ns0.64
Perf_Regex_Industry_LeipzigCount\main\corerun.exeTom.{10,25}riverriver.{10,25}TomNonBacktracking25,348,974.81 ns1.00
Perf_Regex_Industry_LeipzigCount\pr\corerun.exeTom.{10,25}riverriver.{10,25}TomNonBacktracking12,004,805.77 ns0.47
Perf_Regex_Industry_LeipzigCount\main\corerun.exeTomSawyerHuckleberryFinnNone
Perf_Regex_Industry_LeipzigCount\pr\corerun.exeTomSawyerHuckleberryFinnNone
Perf_Regex_Industry_LeipzigCount\main\corerun.exeTomSawyerHuckleberryFinnCompiled
Perf_Regex_Industry_LeipzigCount\pr\corerun.exeTomSawyerHuckleberryFinnCompiled
Perf_Regex_Industry_LeipzigCount\main\corerun.exeTomSawyerHuckleberryFinnNonBacktracking
Perf_Regex_Industry_LeipzigCount\pr\corerun.exeTomSawyerHuckleberryFinnNonBacktracking
Perf_Regex_Industry_LeipzigCount\main\corerun.exeTwainNone2,496,472.08 ns1.00168,695 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exeTwainNone2,472,790.84 ns0.99168,695 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exeTwainCompiled2,455,009.63 ns1.00168,695 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exeTwainCompiled2,462,571.43 ns1.00168,695 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exeTwainNonBacktracking16,403,234.87 ns1.00168,736 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exeTwainNonBacktracking2,527,594.07 ns0.15168,695 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe[a-z]shingNone599,066,058.33 ns1.00321,816 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe[a-z]shingNone10,725,073.60 ns0.02320,351 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe[a-z]shingCompiled147,963,307.69 ns1.00321,040 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe[a-z]shingCompiled7,131,160.83 ns0.05320,337 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe[a-z]shingNonBacktracking145,988,333.33 ns1.00321,040 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe[a-z]shingNonBacktracking10,647,451.24 ns0.07320,351 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe\p{Sm}None59,836,651.67 ns1.0014,532 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe\p{Sm}None37,603,825.51 ns0.6314,455 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe\p{Sm}Compiled11,511,310.10 ns1.0014,378 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe\p{Sm}Compiled11,461,300.96 ns1.0014,378 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exe\p{Sm}NonBacktracking22,524,769.70 ns1.0014,417 B
Perf_Regex_Industry_LeipzigCount\pr\corerun.exe\p{Sm}NonBacktracking33,702,615.48 ns1.5014,455 B
Perf_Regex_Industry_LeipzigCount\main\corerun.exeNone59,780,462.50 ns1.00
Perf_Regex_Industry_LeipzigCount\pr\corerun.exeNone1,635,881.41 ns0.03
Perf_Regex_Industry_LeipzigCount\main\corerun.exeCompiled1,594,729.17 ns1.00
Perf_Regex_Industry_LeipzigCount\pr\corerun.exeCompiled1,581,152.46 ns0.99
Perf_Regex_Industry_LeipzigCount\main\corerun.exeNonBacktracking1,593,292.99 ns1.00
Perf_Regex_Industry_LeipzigCount\pr\corerun.exeNonBacktracking1,588,459.52 ns1.00
RegexRedux_1RegexRedux_1\main\corerun.exe?None41,553,682.14 ns1.002,969,988 B
RegexRedux_1RegexRedux_1\pr\corerun.exe?None37,636,891.67 ns0.912,997,420 B
RegexRedux_5RegexRedux_5\main\corerun.exe?None28,241,272.14 ns1.002,798,768 B
RegexRedux_5RegexRedux_5\pr\corerun.exe?None25,294,893.33 ns0.902,796,740 B
RegexRedux_5RegexRedux_5\main\corerun.exe?Compiled7,643,919.64 ns1.002,799,742 B
RegexRedux_5RegexRedux_5\pr\corerun.exe?Compiled6,647,241.64 ns0.872,803,373 B
Perf_Regex_Industry_MariomkaCtor\main\corerun.exe[\w.+-]+@[\w.-]+.[\w.-]+None1,802.79 ns1.003,200 B
Perf_Regex_Industry_MariomkaCtor\pr\corerun.exe[\w.+-]+@[\w.-]+.[\w.-]+None1,739.21 ns0.962,776 B
Perf_Regex_Industry_MariomkaCount\main\corerun.exe[\w.+-]+@[\w.-]+.[\w.-]+None95,420,267.86 ns1.0019,496 B
Perf_Regex_Industry_MariomkaCount\pr\corerun.exe[\w.+-]+@[\w.-]+.[\w.-]+None87,752,300.00 ns0.9219,316 B
Perf_Regex_Industry_MariomkaCtor\main\corerun.exe[\w.+-]+@[\w.-]+.[\w.-]+Compiled18,857.49 ns1.0012,656 B
Perf_Regex_Industry_MariomkaCtor\pr\corerun.exe[\w.+-]+@[\w.-]+.[\w.-]+Compiled18,631.30 ns0.9912,184 B
Perf_Regex_Industry_MariomkaCount\main\corerun.exe[\w.+-]+@[\w.-]+.[\w.-]+Compiled43,516,983.33 ns1.0019,256 B
Perf_Regex_Industry_MariomkaCount\pr\corerun.exe[\w.+-]+@[\w.-]+.[\w.-]+Compiled43,390,845.83 ns1.0019,256 B
Perf_Regex_Industry_MariomkaCtor\main\corerun.exe[\w.+-]+@[\w.-]+.[\w.-]+NonBacktracking381,762.44 ns1.00310,025 B
Perf_Regex_Industry_MariomkaCtor\pr\corerun.exe[\w.+-]+@[\w.-]+.[\w.-]+NonBacktracking378,707.92 ns0.99307,937 B
Perf_Regex_Industry_MariomkaCount\main\corerun.exe[\w.+-]+@[\w.-]+.[\w.-]+NonBacktracking58,316,891.67 ns1.0019,316 B
Perf_Regex_Industry_MariomkaCount\pr\corerun.exe[\w.+-]+@[\w.-]+.[\w.-]+NonBacktracking66,558,896.43 ns1.1419,316 B
Perf_Regex_Industry_MariomkaCtor\main\corerun.exe[\w]+://[^/\s(...)?(?:#[^\s]*)? [51]None3,139.49 ns1.004,848 B
Perf_Regex_Industry_MariomkaCtor\pr\corerun.exe[\w]+://[^/\s(...)?(?:#[^\s]*)? [51]None3,039.44 ns0.974,504 B
Perf_Regex_Industry_MariomkaCount\main\corerun.exe[\w]+://[^/\s(...)?(?:#[^\s]*)? [51]None97,749,153.33 ns1.001,102,968 B
Perf_Regex_Industry_MariomkaCount\pr\corerun.exe[\w]+://[^/\s(...)?(?:#[^\s]*)? [51]None85,637,781.67 ns0.881,102,788 B
Perf_Regex_Industry_MariomkaCtor\main\corerun.exe[\w]+://[^/\s(...)?(?:#[^\s]*)? [51]Compiled38,322.31 ns1.0026,617 B
Perf_Regex_Industry_MariomkaCtor\pr\corerun.exe[\w]+://[^/\s(...)?(?:#[^\s]*)? [51]Compiled38,197.63 ns1.0026,224 B
Perf_Regex_Industry_MariomkaCount\main\corerun.exe[\w]+://[^/\s(...)?(?:#[^\s]*)? [51]Compiled46,282,289.29 ns1.001,102,788 B
Perf_Regex_Industry_MariomkaCount\pr\corerun.exe[\w]+://[^/\s(...)?(?:#[^\s]*)? [51]Compiled46,220,502.08 ns1.001,102,788 B
Perf_Regex_Industry_MariomkaCtor\main\corerun.exe[\w]+://[^/\s(...)?(?:#[^\s]*)? [51]NonBacktracking405,126.79 ns1.00343,774 B
Perf_Regex_Industry_MariomkaCtor\pr\corerun.exe[\w]+://[^/\s(...)?(?:#[^\s]*)? [51]NonBacktracking403,840.97 ns1.00341,761 B
Perf_Regex_Industry_MariomkaCount\main\corerun.exe[\w]+://[^/\s(...)?(?:#[^\s]*)? [51]NonBacktracking59,939,631.67 ns1.001,102,788 B
Perf_Regex_Industry_MariomkaCount\pr\corerun.exe[\w]+://[^/\s(...)?(?:#[^\s]*)? [51]NonBacktracking68,354,913.33 ns1.141,102,788 B
Perf_Regex_Industry_MariomkaCtor\main\corerun.exe(?:(?:250-5]?[0-9][0-9]) [87]None6,482.24 ns1.008,080 B
Perf_Regex_Industry_MariomkaCtor\pr\corerun.exe(?:(?:250-5]?[0-9][0-9]) [87]None7,115.57 ns1.108,280 B
Perf_Regex_Industry_MariomkaCount\main\corerun.exe(?:(?:250-5]?[0-9][0-9]) [87]None38,004,650.00 ns1.00-
Perf_Regex_Industry_MariomkaCount\pr\corerun.exe(?:(?:250-5]?[0-9][0-9]) [87]None28,049,133.67 ns0.741,191 B
Perf_Regex_Industry_MariomkaCtor\main\corerun.exe(?:(?:250-5]?[0-9][0-9]) [87]Compiled23,165.01 ns1.0023,208 B
Perf_Regex_Industry_MariomkaCtor\pr\corerun.exe(?:(?:250-5]?[0-9][0-9]) [87]Compiled25,439.48 ns1.1025,056 B
Perf_Regex_Industry_MariomkaCount\main\corerun.exe(?:(?:250-5]?[0-9][0-9]) [87]Compiled6,370,831.99 ns1.001,064 B
Perf_Regex_Industry_MariomkaCount\pr\corerun.exe(?:(?:250-5]?[0-9][0-9]) [87]Compiled6,350,644.31 ns1.001,064 B
Perf_Regex_Industry_MariomkaCtor\main\corerun.exe(?:(?:250-5]?[0-9][0-9]) [87]NonBacktracking87,644.59 ns1.00149,648 B
Perf_Regex_Industry_MariomkaCtor\pr\corerun.exe(?:(?:250-5]?[0-9][0-9]) [87]NonBacktracking86,663.11 ns0.99149,761 B
Perf_Regex_Industry_MariomkaCount\main\corerun.exe(?:(?:250-5]?[0-9][0-9]) [87]NonBacktracking12,839,413.91 ns1.001,078 B
Perf_Regex_Industry_MariomkaCount\pr\corerun.exe(?:(?:250-5]?[0-9][0-9]) [87]NonBacktracking20,377,364.29 ns1.591,172 B
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None62.76 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None65.89 ns1.05-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled40.85 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled40.91 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking60.50 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking87.16 ns1.44-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None161.46 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None154.61 ns0.96-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled73.30 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled74.59 ns1.02-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking687.45 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking795.49 ns1.16-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None271.85 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None246.07 ns0.91-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled97.16 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled102.06 ns1.05-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking178.90 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking215.75 ns1.21-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None455.16 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None385.55 ns0.85-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled140.98 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled141.24 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking246.23 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking272.41 ns1.11-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None378.95 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None308.17 ns0.81-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled123.57 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled123.34 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking173.93 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking184.33 ns1.06-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None379.94 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None340.22 ns0.90-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled125.34 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled125.96 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking193.62 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking212.19 ns1.10-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None128.85 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None116.89 ns0.91-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled42.61 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled43.78 ns1.03-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking128.33 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking135.73 ns1.06-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None125.60 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None116.10 ns0.92-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled42.59 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled42.88 ns1.01-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking105.04 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking111.33 ns1.06-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None125.07 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None117.37 ns0.94-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled41.76 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled43.25 ns1.04-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking111.49 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking127.97 ns1.15-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None134.56 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None112.85 ns0.84-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled40.26 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled40.11 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking131.19 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking137.44 ns1.04-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None135.09 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None116.08 ns0.86-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled41.20 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled41.21 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking141.80 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking158.57 ns1.12-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None97.53 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None90.09 ns0.92-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled38.86 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled38.74 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking85.60 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking89.90 ns1.05-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None125.16 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None111.89 ns0.89-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled44.82 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled44.80 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking139.00 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking149.30 ns1.07-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?None124.67 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?None111.90 ns0.90-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?Compiled44.98 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?Compiled44.89 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\main\corerun.exe?NonBacktracking138.01 ns1.00-
Perf_Regex_Industry_BoostDocs_SimpleIsMatch\pr\corerun.exe?NonBacktracking150.78 ns1.09-
Perf_Regex_CacheIsMatch\main\corerun.exe??36,280,917.50 ns1.00107,200,120 B
Perf_Regex_CacheIsMatch\pr\corerun.exe??36,889,390.00 ns1.0296,000,120 B
Perf_Regex_CacheIsMatch_Multithreading\main\corerun.exe??12,761,217.00 ns1.00107,201,136 B
Perf_Regex_CacheIsMatch_Multithreading\pr\corerun.exe??13,376,354.51 ns1.0596,001,191 B
Perf_Regex_CacheIsMatch\main\corerun.exe??81,442,280.00 ns1.00167,802,952 B
Perf_Regex_CacheIsMatch\pr\corerun.exe??86,256,273.33 ns1.06156,706,832 B
Perf_Regex_CacheIsMatch_Multithreading\main\corerun.exe??30,305,710.26 ns1.00167,729,155 B
Perf_Regex_CacheIsMatch_Multithreading\pr\corerun.exe??30,574,329.76 ns1.01156,658,415 B
Perf_Regex_CacheIsMatch\main\corerun.exe??69,044,760.00 ns1.0087,588,848 B
Perf_Regex_CacheIsMatch\pr\corerun.exe??70,905,162.50 ns1.0381,324,192 B
Perf_Regex_CacheIsMatch_Multithreading\main\corerun.exe??47,851,511.25 ns1.0087,702,890 B
Perf_Regex_CacheIsMatch_Multithreading\pr\corerun.exe??45,735,085.00 ns0.9681,969,042 B
Perf_Regex_CacheIsMatch\main\corerun.exe??10,561,671.87 ns1.00-
Perf_Regex_CacheIsMatch\pr\corerun.exe??9,933,559.23 ns0.93-
Perf_Regex_CacheIsMatch_Multithreading\main\corerun.exe??3,997,190.25 ns1.0061,736 B
Perf_Regex_CacheIsMatch_Multithreading\pr\corerun.exe??3,979,859.55 ns1.0060,089 B
Perf_Regex_CacheIsMatch\main\corerun.exe??38,446,023.08 ns1.00-
Perf_Regex_CacheIsMatch\pr\corerun.exe??38,502,030.36 ns1.00-
Perf_Regex_CacheIsMatch_Multithreading\main\corerun.exe??35,723,650.00 ns1.0061,161,464 B
Perf_Regex_CacheIsMatch_Multithreading\pr\corerun.exe??35,247,306.48 ns0.9968,409,013 B
Perf_Regex_CacheIsMatch\main\corerun.exe??51,511,911.54 ns1.00-
Perf_Regex_CacheIsMatch\pr\corerun.exe??50,659,253.33 ns0.98-
Perf_Regex_CacheIsMatch_Multithreading\main\corerun.exe??40,094,616.25 ns1.0049,705,372 B
Perf_Regex_CacheIsMatch_Multithreading\pr\corerun.exe??39,284,054.17 ns0.9859,197,761 B
Perf_Regex_CommonBacktracking\main\corerun.exe?Compiled163.01 ns1.00248 B
Perf_Regex_CommonBacktracking\pr\corerun.exe?Compiled162.43 ns1.00248 B
Perf_Regex_CommonOneNodeBacktracking\main\corerun.exe?Compiled832.26 ns1.00-
Perf_Regex_CommonOneNodeBacktracking\pr\corerun.exe?Compiled836.37 ns1.00-
Perf_Regex_CommonEmail_IsMatch\main\corerun.exe?Compiled139.34 ns1.00-
Perf_Regex_CommonEmail_IsMatch\pr\corerun.exe?Compiled138.68 ns1.00-
Perf_Regex_CommonEmail_IsNotMatch\main\corerun.exe?Compiled206.52 ns1.00-
Perf_Regex_CommonEmail_IsNotMatch\pr\corerun.exe?Compiled204.28 ns0.99-
Perf_Regex_CommonDate_IsMatch\main\corerun.exe?Compiled63.72 ns1.00-
Perf_Regex_CommonDate_IsMatch\pr\corerun.exe?Compiled63.68 ns1.00-
Perf_Regex_CommonDate_IsNotMatch\main\corerun.exe?Compiled117.46 ns1.00-
Perf_Regex_CommonDate_IsNotMatch\pr\corerun.exe?Compiled117.10 ns1.00-
Perf_Regex_CommonIP_IsMatch\main\corerun.exe?Compiled175.79 ns1.00-
Perf_Regex_CommonIP_IsMatch\pr\corerun.exe?Compiled170.89 ns0.97-
Perf_Regex_CommonIP_IsNotMatch\main\corerun.exe?Compiled172.14 ns1.00-
Perf_Regex_CommonIP_IsNotMatch\pr\corerun.exe?Compiled169.62 ns0.99-
Perf_Regex_CommonUri_IsMatch\main\corerun.exe?Compiled98.32 ns1.00-
Perf_Regex_CommonUri_IsMatch\pr\corerun.exe?Compiled97.08 ns0.99-
Perf_Regex_CommonUri_IsNotMatch\main\corerun.exe?Compiled111.65 ns1.00-
Perf_Regex_CommonUri_IsNotMatch\pr\corerun.exe?Compiled110.41 ns0.99-
Perf_Regex_CommonMatchesSet\main\corerun.exe?Compiled53,520.11 ns1.006,696 B
Perf_Regex_CommonMatchesSet\pr\corerun.exe?Compiled47,569.43 ns0.896,696 B
Perf_Regex_CommonMatchesBoundary\main\corerun.exe?Compiled57,333.98 ns1.006,696 B
Perf_Regex_CommonMatchesBoundary\pr\corerun.exe?Compiled47,398.43 ns0.836,696 B
Perf_Regex_CommonMatchesWord\main\corerun.exe?Compiled2,394.39 ns1.001,480 B
Perf_Regex_CommonMatchesWord\pr\corerun.exe?Compiled2,402.48 ns1.011,480 B
Perf_Regex_CommonMatchesWords\main\corerun.exe?Compiled6,161.95 ns1.003,504 B
Perf_Regex_CommonMatchesWords\pr\corerun.exe?Compiled2,368.01 ns0.383,504 B
Perf_Regex_CommonMatchWord\main\corerun.exe?Compiled182.13 ns1.00208 B
Perf_Regex_CommonMatchWord\pr\corerun.exe?Compiled111.33 ns0.61208 B
Perf_Regex_CommonReplaceWords\main\corerun.exe?Compiled6,139.28 ns1.006,848 B
Perf_Regex_CommonReplaceWords\pr\corerun.exe?Compiled2,302.15 ns0.386,848 B
Perf_Regex_CommonSplitWords\main\corerun.exe?Compiled6,014.93 ns1.007,432 B
Perf_Regex_CommonSplitWords\pr\corerun.exe?Compiled2,177.28 ns0.367,432 B
Perf_Regex_CommonCtor\main\corerun.exe?Compiled24,304.05 ns1.0027,704 B
Perf_Regex_CommonCtor\pr\corerun.exe?Compiled22,017.27 ns0.9126,192 B
Perf_Regex_CommonCtorInvoke\main\corerun.exe?Compiled117,871.80 ns1.0030,678 B
Perf_Regex_CommonCtorInvoke\pr\corerun.exe?Compiled106,120.75 ns0.9029,068 B
Perf_Regex_CommonBacktracking\main\corerun.exe?IgnoreCase, Compiled338.38 ns1.00248 B
Perf_Regex_CommonBacktracking\pr\corerun.exe?IgnoreCase, Compiled182.80 ns0.54248 B
Perf_Regex_CommonOneNodeBacktracking\main\corerun.exe?IgnoreCase, Compiled1,572.31 ns1.00-
Perf_Regex_CommonOneNodeBacktracking\pr\corerun.exe?IgnoreCase, Compiled1,609.75 ns1.02-
Perf_Regex_CommonEmail_IsMatch\main\corerun.exe?IgnoreCase, Compiled205.08 ns1.00-
Perf_Regex_CommonEmail_IsMatch\pr\corerun.exe?IgnoreCase, Compiled204.21 ns0.99-
Perf_Regex_CommonEmail_IsNotMatch\main\corerun.exe?IgnoreCase, Compiled284.11 ns1.00-
Perf_Regex_CommonEmail_IsNotMatch\pr\corerun.exe?IgnoreCase, Compiled465.74 ns1.64-
Perf_Regex_CommonDate_IsMatch\main\corerun.exe?IgnoreCase, Compiled77.45 ns1.00-
Perf_Regex_CommonDate_IsMatch\pr\corerun.exe?IgnoreCase, Compiled72.86 ns0.94-
Perf_Regex_CommonDate_IsNotMatch\main\corerun.exe?IgnoreCase, Compiled179.35 ns1.00-
Perf_Regex_CommonDate_IsNotMatch\pr\corerun.exe?IgnoreCase, Compiled155.91 ns0.87-
Perf_Regex_CommonIP_IsMatch\main\corerun.exe?IgnoreCase, Compiled288.47 ns1.00-
Perf_Regex_CommonIP_IsMatch\pr\corerun.exe?IgnoreCase, Compiled174.70 ns0.60-
Perf_Regex_CommonIP_IsNotMatch\main\corerun.exe?IgnoreCase, Compiled274.28 ns1.00-
Perf_Regex_CommonIP_IsNotMatch\pr\corerun.exe?IgnoreCase, Compiled175.90 ns0.64-
Perf_Regex_CommonUri_IsMatch\main\corerun.exe?IgnoreCase, Compiled143.39 ns1.00-
Perf_Regex_CommonUri_IsMatch\pr\corerun.exe?IgnoreCase, Compiled142.52 ns0.99-
Perf_Regex_CommonUri_IsNotMatch\main\corerun.exe?IgnoreCase, Compiled190.72 ns1.00-
Perf_Regex_CommonUri_IsNotMatch\pr\corerun.exe?IgnoreCase, Compiled337.76 ns1.77-
Perf_Regex_CommonMatchesSet\main\corerun.exe?IgnoreCase, Compiled102,966.36 ns1.006,696 B
Perf_Regex_CommonMatchesSet\pr\corerun.exe?IgnoreCase, Compiled57,836.41 ns0.566,696 B
Perf_Regex_CommonMatchesBoundary\main\corerun.exe?IgnoreCase, Compiled99,719.82 ns1.006,696 B
Perf_Regex_CommonMatchesBoundary\pr\corerun.exe?IgnoreCase, Compiled58,803.43 ns0.596,696 B
Perf_Regex_CommonMatchesWord\main\corerun.exe?IgnoreCase, Compiled3,296.76 ns1.001,480 B
Perf_Regex_CommonMatchesWord\pr\corerun.exe?IgnoreCase, Compiled1,483.23 ns0.451,480 B
Perf_Regex_CommonMatchesWords\main\corerun.exe?IgnoreCase, Compiled17,183.53 ns1.003,504 B
Perf_Regex_CommonMatchesWords\pr\corerun.exe?IgnoreCase, Compiled3,085.54 ns0.183,504 B
Perf_Regex_CommonMatchWord\main\corerun.exe?IgnoreCase, Compiled408.74 ns1.00208 B
Perf_Regex_CommonMatchWord\pr\corerun.exe?IgnoreCase, Compiled142.45 ns0.35208 B
Perf_Regex_CommonReplaceWords\main\corerun.exe?IgnoreCase, Compiled14,457.45 ns1.006,848 B
Perf_Regex_CommonReplaceWords\pr\corerun.exe?IgnoreCase, Compiled3,074.16 ns0.216,848 B
Perf_Regex_CommonSplitWords\main\corerun.exe?IgnoreCase, Compiled14,659.64 ns1.007,432 B
Perf_Regex_CommonSplitWords\pr\corerun.exe?IgnoreCase, Compiled2,864.13 ns0.207,432 B
Perf_Regex_CommonCtor\main\corerun.exe?IgnoreCase, Compiled30,940.34 ns1.0029,968 B
Perf_Regex_CommonCtor\pr\corerun.exe?IgnoreCase, Compiled30,597.55 ns0.9930,688 B
Perf_Regex_CommonCtorInvoke\main\corerun.exe?IgnoreCase, Compiled168,305.30 ns1.0033,310 B
Perf_Regex_CommonCtorInvoke\pr\corerun.exe?IgnoreCase, Compiled123,219.24 ns0.7334,008 B
Perf_Regex_CommonBacktracking\main\corerun.exe?None1,456.25 ns1.00248 B
Perf_Regex_CommonBacktracking\pr\corerun.exe?None1,426.05 ns0.98248 B
Perf_Regex_CommonOneNodeBacktracking\main\corerun.exe?None5,649.41 ns1.00-
Perf_Regex_CommonOneNodeBacktracking\pr\corerun.exe?None5,528.62 ns0.98-
Perf_Regex_CommonEmail_IsMatch\main\corerun.exe?None447.34 ns1.00-
Perf_Regex_CommonEmail_IsMatch\pr\corerun.exe?None363.43 ns0.81-
Perf_Regex_CommonEmail_IsNotMatch\main\corerun.exe?None731.32 ns1.00-
Perf_Regex_CommonEmail_IsNotMatch\pr\corerun.exe?None683.95 ns0.94-
Perf_Regex_CommonDate_IsMatch\main\corerun.exe?None179.07 ns1.00-
Perf_Regex_CommonDate_IsMatch\pr\corerun.exe?None157.20 ns0.88-
Perf_Regex_CommonDate_IsNotMatch\main\corerun.exe?None408.42 ns1.00-
Perf_Regex_CommonDate_IsNotMatch\pr\corerun.exe?None352.61 ns0.86-
Perf_Regex_CommonIP_IsMatch\main\corerun.exe?None635.05 ns1.00-
Perf_Regex_CommonIP_IsMatch\pr\corerun.exe?None587.15 ns0.92-
Perf_Regex_CommonIP_IsNotMatch\main\corerun.exe?None637.63 ns1.00-
Perf_Regex_CommonIP_IsNotMatch\pr\corerun.exe?None589.94 ns0.93-
Perf_Regex_CommonUri_IsMatch\main\corerun.exe?None290.58 ns1.00-
Perf_Regex_CommonUri_IsMatch\pr\corerun.exe?None252.66 ns0.87-
Perf_Regex_CommonUri_IsNotMatch\main\corerun.exe?None346.54 ns1.00-
Perf_Regex_CommonUri_IsNotMatch\pr\corerun.exe?None293.83 ns0.85-
Perf_Regex_CommonMatchesSet\main\corerun.exe?None179,077.37 ns1.006,697 B
Perf_Regex_CommonMatchesSet\pr\corerun.exe?None132,097.01 ns0.746,696 B
Perf_Regex_CommonMatchesBoundary\main\corerun.exe?None135,424.94 ns1.006,696 B
Perf_Regex_CommonMatchesBoundary\pr\corerun.exe?None113,965.33 ns0.846,697 B
Perf_Regex_CommonMatchesWord\main\corerun.exe?None2,593.70 ns1.001,480 B
Perf_Regex_CommonMatchesWord\pr\corerun.exe?None2,590.69 ns1.001,480 B
Perf_Regex_CommonMatchesWords\main\corerun.exe?None65,701.25 ns1.003,504 B
Perf_Regex_CommonMatchesWords\pr\corerun.exe?None51,628.86 ns0.783,504 B
Perf_Regex_CommonMatchWord\main\corerun.exe?None1,680.69 ns1.00208 B
Perf_Regex_CommonMatchWord\pr\corerun.exe?None1,369.82 ns0.82208 B
Perf_Regex_CommonReplaceWords\main\corerun.exe?None65,371.10 ns1.006,849 B
Perf_Regex_CommonReplaceWords\pr\corerun.exe?None53,501.68 ns0.816,848 B
Perf_Regex_CommonSplitWords\main\corerun.exe?None66,615.21 ns1.007,433 B
Perf_Regex_CommonSplitWords\pr\corerun.exe?None50,404.24 ns0.767,432 B
Perf_Regex_CommonCtor\main\corerun.exe?None5,296.62 ns1.007,552 B
Perf_Regex_CommonCtor\pr\corerun.exe?None4,813.12 ns0.916,744 B
Perf_Regex_CommonCtorInvoke\main\corerun.exe?None5,270.26 ns1.007,696 B
Perf_Regex_CommonCtorInvoke\pr\corerun.exe?None4,784.73 ns0.916,880 B
Author:stephentoub
Assignees:-
Labels:

area-System.Text.RegularExpressions

Milestone:7.0.0

@stephentoub

Copy link
Copy Markdown
MemberAuthor

@olsaarik, @veanes, please take a look at the NonBacktracking changes when you get a moment.

Also, this specific improvement stands out:

TypeMethodToolchainPatternOptionsMeanRatioAllocated
Perf_Regex_Industry_RustLang_SherlockCount\main\corerun.exe[a-q][^u-z]{13}xNonBacktracking1,913,033,821.43 ns1.0002,250,206,424 B
Perf_Regex_Industry_RustLang_SherlockCount\pr\corerun.exe[a-q][^u-z]{13}xNonBacktracking99,301.51 ns0.00029,536 B

and while it's great that it improved so much, that improvement comes just from skipping ahead, and these numbers suggest that if it wasn't able to skip ahead like that, there's some kind of real perf issue lurking.

@stephentoub

Copy link
Copy Markdown
MemberAuthor

cc: @danmoseley

@danmoseley

Copy link
Copy Markdown
Contributor

Awesome.

Looking at the perf results - for the scenario with the value 136.19 ns, why is Compiled 10,000 times faster than the others?

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Looking at the perf results - for the scenario with the value 136.19 ns, why is Compiled 10,000 times faster than the others?

One of the advantages of the extra analysis that's done in compilation. The pattern here is (?s).*. That's single-line mode doing a .*, which means match all of anything. The compiled code recognizes that and simply jumps to the end.

elseif(node.IsSetFamily&&maxIterations==int.MaxValue&&node.Str==RegexCharClass.AnyClass)
{
// .* was used with RegexOptions.Singleline, which means it'll consume everything. Just jump to the end.
// The unbounded constraint is the same as in the Notone case above, done purely for simplicity.
// int i = runtextend - runtextpos;
TransferTextSpanPosToRunTextPos();
Ldloc(runtextendLocal);
Ldloc(runtextposLocal);
Sub();
Stloc(iterationLocal);
}

@danmoseley

Copy link
Copy Markdown
Contributor

The compiled code recognizes that and simply jumps to the end.

Presumably the interpreter/backtracking could easily jump to the end as well?
Actually, I wonder whether the regex writer stage could transform this to something, eg., (?s)$ that would have the same effect.

@danmoseley

Copy link
Copy Markdown
Contributor

@joperezr a nice easy review to get warmed up with? 😄

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Presumably the interpreter/backtracking could easily jump to the end as well?

Sure, if it added a check at execution time.

I wonder whether the regex writer stage could transform this to something, eg., (?s)$ that would have the same effect.

Is this really a pattern we care to optimize? The optimization in the compiler is there to better handle the case where this is in the middle of the pattern, and it simply carries over to this corner-case.

@danmoseley

Copy link
Copy Markdown
Contributor

@stephentoub some of the rows in your table seem to be broken because | was not escaped (maybe we should open Benchmark.NET bug?) eg., Baker [49] rows.

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Some of the rows in your table seem to be broken because | was not escaped

Ugh. I manually escaped a bunch of things, but I'll go back and see what I missed.

maybe we should open Benchmark.NET bug?

dotnet/BenchmarkDotNet#1839

@stephentoub

Copy link
Copy Markdown
MemberAuthor

eg., Baker [49] rows.

Hmm, I'm not seeing any that are broken. I fixed a bunch yesterday within minutes after opening the PR and seeing the output. Have you refreshed? Or, if they're still there, which lines exactly?

@danmoseley

Copy link
Copy Markdown
Contributor

Ah, yes I just hadn't refreshed. Still it's good you opened the bug.

@stephentoub
stephentoubforce-pushed the factoroutffc4 branch 2 times, most recently from dbdf454 to 2936610CompareNovember 15, 2021 21:10
@stephentoub

Copy link
Copy Markdown
MemberAuthor

Also, this specific improvement stands out

Profiling it, this particular issue is due to the Antimirov (NFA) mode. It's currently really slow, and this particular pattern ends up tripping over the 10K DFA state limit (it ends up with something like 15K states if I let it) that puts it into that mode; the monstrous perf gap goes away if I lift the state limit. #60918 tracks at least one aspect of improving its performance.
cc: @olsaarik

Comment threadsrc/libraries/System.Text.RegularExpressions/gen/RegexGenerator.Emitter.cs Outdated
…tChar
This change started with the "simple" goal of factoring out the FindFirstChar logic from RegexInterpreter and consuming it in SymbolicRegexMatcher. The existing engines use FindFirstChar to quickly skip ahead to the next location that might possibly match, at which point they fall back to analyzing the whole pattern at that location. SymbolicRegexMatcher (used by RegexOptions.NonBacktracking) had its own implementation for this, which it used any time it entered a start state. This required non-trivial additional code to maintain, and there's no good reason it should be separate from the other engines.
However, what started out as a simple change grew due to regressions that resulted from differences in the implementations. In particular, SymbolicRegexMatcher already works off of precomputed equivalence tables for casing, which gives it very different characteristics in this regard from the existing engines. For example, SymbolicRegexMatcher's existing "skip ahead to the next possible match start location" logic already evaluated all the characters that could possibly start a match, which included variations of the same character when using IgnoreCase, but the existing RegexInterpreter logic didn't. That discrepancy then results in a significant IgnoreCase regression for NonBacktracking due to losing the ability to use a vectorized search for the next starting location. We already plan to shift the existing engines over to a plan where all of these equivalences are computed at construction time rather than using ToLower at both construction time and match time, so this PR takes some steps in that direction, doing so for most of ASCII. This has added some temporary cruft, which we'll be able to delete once we fully shift the implementations over (which we should do in the near future).
Another difference was SymbolicRegexMatcher was enabling use of IndexOfAny for up to 5 characters, whereas RegexOptions.Compiled was only doing up to 3 characters, and RegexInterpreter wasn't doing for any number. The PR now uses 5 everywhere.
However, the more characters involved, the more overhead there is to IndexOfAny, and for some inputs, the higher the chances are that IndexOfAny will find a match sooner, which means its overhead compounds more. To help with that, we now not only compute the possible characters that might match at the beginning of the pattern, but also characters that might match at a fixed offset from the beginning of the pattern (e.g. in \d{3}-\d{2}-\d{4}, it will find the '-' at offset 3 and be able to vectorize a search for that and then back off by the relevant distance. That then also means we might end up with multiple sets to choose to search for, and this PR borrows an idea from Rust, which is to use some rough frequency analysis to determine which set should be targeted. It's not perfect, and we can update the texts use to seed the analysis (right now I based it primarily on *.cs files in dotnet/runtime and some Project Gutenberg texts), but it's good enough for these purposes for now.
We'd previously switched to using IndexOf for a case-sensitive prefix string, but still were using Boyer-Moore for case-insensitive. Now that we're able to also vectorize a search for case-insensitive values (right now just ASCII letter, but that'll be fixed soon), we can just get rid of Boyer-Moore entirely. This saves all the costs to do with constructing the Boyer-Moore tables and also avoids having to generate the Boyer-Moore implementations in RegexOptions.Compiled and the source generator.
The casing change also defeated some other optimizations already present. For example, in .NET 5 we added an optimization whereby an alternation like `abcef|abcgh` would be transformed into `abc(?:ef|gh)`, and that would apply whether case-sensitive or case-insensitive. But by transforming the expression at construction now for case-insensitive into `[Aa][Bb][Cc][Ee][Ff]|[Aa][Bb][Cc][Gg][Hh]`, that optimization was defeated. I've added a new optimization pass for alternations that will detect common prefixes even if they're sets.
The casing change also revealed some cosmetic issues. As part of the change, when we encounter a "multi" (a multi-character string in the pattern), we convert that single case-insensitive RegexNode to instead be one case-sensitive RegexNode per character, with a set for all the equivalent characters that can match. This then defeats some of the nice formatting we had for multis in the source generator, so as part of this change, the source generator has been augmented to output nicer code for concatenations. And because sets like [Ee] are now way more common (since e.g. a case-insensitive 'e' will be transformed into such a set), we also special-case that in both the source generator and RegexOptions.Compiled, to spit out the equivalent of `(c | 0x20) == 'e'` rather than `(c == 'E'| c == 'e')`.
Along the way, I cleaned up a few things as well, such as passing around a CultureInfo more rather than repeatedly calling CultureInfo.CurrentCulture, using CollectionsMarshal.GetValueRefOrAddDefault on a hot path to do with interning strings in a lookup table, tweaking SymbolicRegexRunnerFactory's Runner to itself be generic to avoid an extra layer of virtual dispatch per operation, and cleaning up code / comments in SymbolicRegexMatcher along the way.
For the most part the purpose of the change wasn't to improve perf, and in fact I was willing to accept some regressions in the name of consolidation. There are a few regressions here, mostly small, and mostly for cases where we're simply paying an overhead for vectorization, e.g. where the current location is fine to match, or where the target character being searched for is very frequent. Overall, though, there are some substantial improvements.
Previously return statements while emitting anchors were short-circuiting the rest of the emitting code, but when I moved that code into a helper, the returns stopped having that impact, such that we'd end up emitting a return statement and then emit dead code after it. Fix it.
Comment threadsrc/libraries/System.Text.RegularExpressions/gen/RegexGenerator.Emitter.cs Outdated
@stephentoub

Copy link
Copy Markdown
MemberAuthor

@danmoseley, @joperezr, are you comfortable with this being merged? It touches a lot of code and it'd be nice to get it in to unblock other things in the same areas, e.g. I imagine this FindFirstChar logic might be one of the first places Jose wants to touch when starting to use span more throughout as part of #59629.

@danmoseley

Copy link
Copy Markdown
Contributor

I'm fine with that if @joperezr signs off.

@joperezrjoperezr left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry for the hold up. I'm still working on getting familiar with this codebase in order to fully understand all of the changes here, but the actual changes being made make sense and I've also been testing your changes for a couple days now for the interpreted, source generated, and compiled engines and they all seem to be working great and I do see improvements on FindFirstChar method.

@stephentoub

Copy link
Copy Markdown
MemberAuthor

Excellent. Thanks, Jose.

@DrewScoggins

Copy link
Copy Markdown
Member

Improvements: dotnet/perf-autofiling-issues#2424

@EgorBo

EgorBo commented Dec 2, 2021

Copy link
Copy Markdown
Member

@ghostghost locked as resolved and limited conversation to collaborators Jan 1, 2022
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@stephentoub@danmoseley@DrewScoggins@AndyAyersMS@EgorBo@joperezr