Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Merged
merged 6 commits into from
Nov 17, 2021

Conversation

stephentoub
Copy link
Member

@stephentoub stephentoub commented Nov 12, 2021

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
Type Method Toolchain Pattern Options Mean Ratio Allocated
Perf_Regex_Industry_SliceSlice Count \main\corerun.exe ? IgnoreCase 5,919,020,750.00 ns 1.00 229,137,752 B
Perf_Regex_Industry_SliceSlice Count \pr\corerun.exe ? IgnoreCase 2,655,622,120.00 ns 0.45 229,135,392 B
Perf_Regex_Industry_SliceSlice Count \main\corerun.exe ? IgnoreCase, Compiled 5,980,794,825.00 ns 1.00 229,135,392 B
Perf_Regex_Industry_SliceSlice Count \pr\corerun.exe ? IgnoreCase, Compiled 1,709,189,240.00 ns 0.29 229,135,392 B
Perf_Regex_Industry_SliceSlice Count \main\corerun.exe ? IgnoreCase, NonBacktracking 6,274,067,325.00 ns 1.00 229,135,392 B
Perf_Regex_Industry_SliceSlice Count \pr\corerun.exe ? IgnoreCase, NonBacktracking 2,792,333,450.00 ns 0.45 229,135,392 B
Perf_Regex_Industry_SliceSlice Count \main\corerun.exe ? None 3,769,231,500.00 ns 1.00 114,408,208 B
Perf_Regex_Industry_SliceSlice Count \pr\corerun.exe ? None 3,714,378,675.00 ns 0.99 114,408,208 B
Perf_Regex_Industry_SliceSlice Count \main\corerun.exe ? Compiled 3,706,293,650.00 ns 1.00 150,863,280 B
Perf_Regex_Industry_SliceSlice Count \pr\corerun.exe ? Compiled 3,710,450,780.00 ns 1.00 114,408,160 B
Perf_Regex_Industry_SliceSlice Count \main\corerun.exe ? NonBacktracking 4,208,438,720.00 ns 1.00 114,408,208 B
Perf_Regex_Industry_SliceSlice Count \pr\corerun.exe ? NonBacktracking 3,745,114,350.00 ns 0.89 114,408,208 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Holmes None 789,132.09 ns 1.00 97,138 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Holmes None 688,469.87 ns 0.87 97,138 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Holmes Compiled 808,262.69 ns 1.00 97,138 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Holmes Compiled 417,193.55 ns 0.52 97,137 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Holmes NonBacktracking 725,918.41 ns 1.00 97,138 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Holmes NonBacktracking 685,504.44 ns 0.94 97,140 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sher[a-z]+|Hol[a-z]+ None 6,870,657.12 ns 1.00 145,019 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sher[a-z]+|Hol[a-z]+ None 4,824,624.36 ns 0.70 144,990 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sher[a-z]+|Hol[a-z]+ Compiled 2,258,139.88 ns 1.00 144,984 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sher[a-z]+|Hol[a-z]+ Compiled 825,089.83 ns 0.37 144,979 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sher[a-z]+|Hol[a-z]+ NonBacktracking 1,890,083.74 ns 1.00 144,981 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sher[a-z]+|Hol[a-z]+ NonBacktracking 1,388,542.11 ns 0.73 144,984 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sherlock None 471,244.46 ns 1.00 21,217 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sherlock None 150,869.37 ns 0.32 21,216 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sherlock Compiled 523,646.53 ns 1.00 21,218 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sherlock Compiled 99,295.06 ns 0.19 21,216 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sherlock NonBacktracking 454,725.55 ns 1.00 21,217 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sherlock NonBacktracking 144,565.38 ns 0.32 21,217 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sherlock Holmes None 400,282.70 ns 1.00 19,970 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sherlock Holmes None 148,763.96 ns 0.37 19,968 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sherlock Holmes Compiled 320,484.07 ns 1.00 19,969 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sherlock Holmes Compiled 97,347.57 ns 0.30 19,968 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sherlock Holmes NonBacktracking 374,497.60 ns 1.00 19,969 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sherlock Holmes NonBacktracking 148,935.01 ns 0.40 19,968 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sherlock|Holmes|Watson None 9,336,569.80 ns 1.00 135,227 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sherlock|Holmes|Watson None 8,944,893.54 ns 0.96 135,258 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sherlock|Holmes|Watson Compiled 2,388,718.93 ns 1.00 135,209 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sherlock|Holmes|Watson Compiled 1,685,141.16 ns 0.71 135,205 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sherlock|Holmes|Watson NonBacktracking 2,627,173.71 ns 1.00 135,213 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sherlock|Holmes|Watson NonBacktracking 3,059,709.81 ns 1.16 135,209 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sherlock|(...)er|John|Baker [49] None 25,380,686.43 ns 1.00 156,696 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sherlock|(...)er|John|Baker [49] None 30,027,019.05 ns 1.18 156,775 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sherlock|(...)er|John|Baker [49] Compiled 3,858,861.83 ns 1.00 156,637 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sherlock|(...)er|John|Baker [49] Compiled 3,112,603.56 ns 0.81 156,639 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sherlock|(...)er|John|Baker [49] NonBacktracking 4,290,006.78 ns 1.00 156,636 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sherlock|(...)er|John|Baker [49] NonBacktracking 4,113,633.45 ns 0.96 156,642 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)the None 2,482,717.44 ns 1.00 1,661,303 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)the None 1,693,418.30 ns 0.68 1,661,301 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)the Compiled 2,410,350.89 ns 1.00 1,661,305 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)the Compiled 1,031,249.35 ns 0.43 1,661,299 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)the NonBacktracking 2,272,962.31 ns 1.00 1,661,303 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)the NonBacktracking 1,699,628.91 ns 0.75 1,661,301 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?m)^Sherlock(...)rlock Holmes$ [37] None 87,770.03 ns 1.00 7,072 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?m)^Sherlock(...)rlock Holmes$ [37] None 49,695.90 ns 0.57 7,072 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?m)^Sherlock(...)rlock Holmes$ [37] Compiled 52,439.39 ns 1.00 7,072 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?m)^Sherlock(...)rlock Holmes$ [37] Compiled 44,650.20 ns 0.85 7,072 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?m)^Sherlock(...)rlock Holmes$ [37] NonBacktracking 83,746.07 ns 1.00 10,097 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?m)^Sherlock(...)rlock Holmes$ [37] NonBacktracking 62,438.20 ns 0.74 7,960 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?s).* None 3,048,148.21 ns 1.00 425 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?s).* None 2,029,877.99 ns 0.67 422 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?s).* Compiled 137.61 ns 1.00 416 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?s).* Compiled 136.19 ns 0.99 416 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?s).* NonBacktracking 4,272,951.28 ns 1.00 431 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?s).* NonBacktracking 3,870,547.32 ns 0.91 429 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe .* None 2,514,522.64 ns 1.00 5,429,847 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe .* None 2,566,864.44 ns 1.02 5,429,851 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe .* Compiled 1,961,965.35 ns 1.00 5,429,846 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe .* Compiled 1,900,608.07 ns 0.97 5,429,848 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe .* NonBacktracking 6,330,598.07 ns 1.00 5,429,859 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe .* NonBacktracking 6,582,895.41 ns 1.04 5,429,866 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Holmes None 99,887.36 ns 1.00 95,888 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Holmes None 101,882.18 ns 1.02 95,888 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Holmes Compiled 88,257.94 ns 1.00 95,888 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Holmes Compiled 86,498.28 ns 0.98 95,888 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Holmes NonBacktracking 534,754.92 ns 1.00 95,890 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Holmes NonBacktracking 119,285.84 ns 0.22 95,890 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Holmes.{0,25}(...).{0,25}Holmes [39] None 2,292,453.21 ns 1.00 1,463 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Holmes.{0,25}(...).{0,25}Holmes [39] None 359,811.76 ns 0.16 1,457 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Holmes.{0,25}(...).{0,25}Holmes [39] Compiled 134,305.47 ns 1.00 1,456 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Holmes.{0,25}(...).{0,25}Holmes [39] Compiled 132,236.00 ns 0.98 1,456 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Holmes.{0,25}(...).{0,25}Holmes [39] NonBacktracking 208,517.33 ns 1.00 1,457 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Holmes.{0,25}(...).{0,25}Holmes [39] NonBacktracking 204,748.72 ns 0.98 1,457 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sher[a-z]+|Hol[a-z]+ None 2,160,430.30 ns 1.00 121,069 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sher[a-z]+|Hol[a-z]+ None 222,265.19 ns 0.10 121,060 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sher[a-z]+|Hol[a-z]+ Compiled 103,542.56 ns 1.00 121,056 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sher[a-z]+|Hol[a-z]+ Compiled 106,307.18 ns 1.03 121,057 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sher[a-z]+|Hol[a-z]+ NonBacktracking 235,204.99 ns 1.00 121,060 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sher[a-z]+|Hol[a-z]+ NonBacktracking 225,376.41 ns 0.96 121,059 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock None 50,969.53 ns 1.00 20,176 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock None 51,119.21 ns 1.00 20,176 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock Compiled 48,287.55 ns 1.00 20,176 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock Compiled 47,980.76 ns 0.99 20,176 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock NonBacktracking 341,080.91 ns 1.00 20,177 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock NonBacktracking 57,424.63 ns 0.17 20,177 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock Holmes None 51,047.67 ns 1.00 18,928 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock Holmes None 53,062.79 ns 1.04 18,928 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock Holmes Compiled 47,868.40 ns 1.00 18,928 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock Holmes Compiled 48,583.45 ns 1.02 18,928 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock Holmes NonBacktracking 272,257.62 ns 1.00 18,929 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock Holmes NonBacktracking 62,228.65 ns 0.23 18,929 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock\s+Holmes None 54,741.68 ns 1.00 20,176 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock\s+Holmes None 54,947.28 ns 1.01 20,176 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock\s+Holmes Compiled 48,400.44 ns 1.00 20,176 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock\s+Holmes Compiled 48,139.39 ns 0.99 20,176 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock\s+Holmes NonBacktracking 368,725.29 ns 1.00 20,177 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock\s+Holmes NonBacktracking 90,658.24 ns 0.25 20,176 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock|Holmes None 2,125,098.17 ns 1.00 116,077 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock|Holmes None 207,549.09 ns 0.10 116,065 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock|Holmes Compiled 101,719.84 ns 1.00 116,064 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock|Holmes Compiled 100,942.91 ns 0.99 116,064 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock|Holmes NonBacktracking 174,869.17 ns 1.00 116,064 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock|Holmes NonBacktracking 167,204.46 ns 0.96 116,064 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock|Holmes|Watson None 2,515,241.57 ns 1.00 132,926 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock|Holmes|Watson None 348,264.09 ns 0.14 132,936 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock|Holmes|Watson Compiled 140,145.51 ns 1.00 132,912 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock|Holmes|Watson Compiled 137,239.30 ns 0.98 132,912 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock|Holmes|Watson NonBacktracking 218,512.11 ns 1.00 132,913 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock|Holmes|Watson NonBacktracking 220,536.51 ns 1.01 132,913 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock|Holm(...)er|John|Baker [45] None 3,465,627.05 ns 1.00 153,932 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock|Holm(...)er|John|Baker [45] None 2,549,994.01 ns 0.74 153,927 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock|Holm(...)er|John|Baker [45] Compiled 994,995.45 ns 1.00 153,923 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock|Holm(...)er|John|Baker [45] Compiled 2,082,308.41 ns 2.09 153,926 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock|Holm(...)er|John|Baker [45] NonBacktracking 1,139,442.03 ns 1.00 153,923 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock|Holm(...)er|John|Baker [45] NonBacktracking 3,034,334.32 ns 2.66 153,942 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock|Street None 106,161.14 ns 1.00 32,864 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock|Street None 111,006.55 ns 1.05 32,866 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock|Street Compiled 60,754.20 ns 1.00 32,864 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock|Street Compiled 57,936.28 ns 0.96 32,864 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock|Street NonBacktracking 128,014.67 ns 1.00 32,865 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock|Street NonBacktracking 112,557.51 ns 0.89 32,865 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe The None 126,093.97 ns 1.00 154,130 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe The None 122,884.38 ns 0.97 154,128 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe The Compiled 106,029.27 ns 1.00 154,128 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe The Compiled 106,163.97 ns 1.00 154,128 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe The NonBacktracking 1,155,649.71 ns 1.00 154,131 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe The NonBacktracking 139,228.02 ns 0.12 154,128 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe [^\n]* None 2,629,307.54 ns 1.00 5,429,847 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe [^\n]* None 2,561,391.44 ns 0.97 5,429,847 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe [^\n]* Compiled 2,028,577.34 ns 1.00 5,429,848 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe [^\n]* Compiled 1,990,132.75 ns 0.98 5,429,848 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe [^\n]* NonBacktracking 6,431,206.78 ns 1.00 5,429,858 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe [^\n]* NonBacktracking 6,572,198.42 ns 1.02 5,429,859 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe [a-q][^u-z]{13}x None 34,370,362.50 ns 1.000 29,656 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe [a-q][^u-z]{13}x None 78,359.01 ns 0.002 29,537 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe [a-q][^u-z]{13}x Compiled 6,114,925.23 ns 1.000 29,551 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe [a-q][^u-z]{13}x Compiled 48,905.68 ns 0.008 29,536 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe [a-q][^u-z]{13}x NonBacktracking 1,913,033,821.43 ns 1.000 2,250,206,424 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe [a-q][^u-z]{13}x NonBacktracking 99,301.51 ns 0.000 29,536 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe [a-zA-Z]+ing None 32,224,692.22 ns 1.00 587,512 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe [a-zA-Z]+ing None 28,495,211.11 ns 0.88 587,580 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe [a-zA-Z]+ing Compiled 5,993,759.29 ns 1.00 587,409 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe [a-zA-Z]+ing Compiled 6,027,973.78 ns 1.01 587,409 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe [a-zA-Z]+ing NonBacktracking 6,064,019.70 ns 1.00 587,410 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe [a-zA-Z]+ing NonBacktracking 7,168,776.00 ns 1.18 587,413 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \b\w+n\b None 31,108,293.27 ns 1.00 1,740,218 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \b\w+n\b None 29,636,470.54 ns 0.95 1,740,340 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \b\w+n\b Compiled 12,133,476.19 ns 1.00 1,740,188 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \b\w+n\b Compiled 12,401,181.55 ns 1.02 1,740,188 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \b\w+n\b NonBacktracking 8,312,614.44 ns 1.00 2,133,560 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \b\w+n\b NonBacktracking 9,244,832.19 ns 1.11 2,097,539 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \p{Ll} None 40,255,786.54 ns 1.00 90,060,020 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \p{Ll} None 40,254,686.54 ns 1.00 90,060,020 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \p{Ll} Compiled 29,305,301.48 ns 1.00 90,059,982 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \p{Ll} Compiled 29,034,462.09 ns 0.99 90,059,920 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \p{Ll} NonBacktracking 53,269,781.25 ns 1.00 90,060,020 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \p{Ll} NonBacktracking 56,607,580.00 ns 1.06 90,060,020 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \p{Lu} None 3,570,983.27 ns 1.00 2,949,450 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \p{Lu} None 2,730,198.37 ns 0.76 2,949,448 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \p{Lu} Compiled 1,474,347.32 ns 1.00 2,949,445 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \p{Lu} Compiled 1,494,025.49 ns 1.01 2,949,445 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \p{Lu} NonBacktracking 2,618,204.59 ns 1.00 2,949,448 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \p{Lu} NonBacktracking 3,088,072.68 ns 1.18 2,949,449 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \p{L} None 42,264,292.86 ns 1.00 93,009,460 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \p{L} None 40,989,263.46 ns 0.97 93,009,460 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \p{L} Compiled 29,678,550.83 ns 1.00 93,009,370 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \p{L} Compiled 30,317,169.53 ns 1.02 93,009,370 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \p{L} NonBacktracking 54,779,287.50 ns 1.00 93,009,642 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \p{L} NonBacktracking 55,246,435.42 ns 1.01 93,009,460 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \s[a-zA-Z]{0,12}ing\s None 20,425,308.15 ns 1.00 432,928 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \s[a-zA-Z]{0,12}ing\s None 18,277,753.21 ns 0.90 432,903 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \s[a-zA-Z]{0,12}ing\s Compiled 5,618,254.65 ns 1.00 432,865 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \s[a-zA-Z]{0,12}ing\s Compiled 5,636,516.96 ns 1.00 432,865 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \s[a-zA-Z]{0,12}ing\s NonBacktracking 4,998,205.23 ns 1.00 432,874 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \s[a-zA-Z]{0,12}ing\s NonBacktracking 5,263,322.98 ns 1.05 432,863 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \w+ None 15,244,954.91 ns 1.00 22,716,557 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \w+ None 13,612,713.69 ns 0.89 22,716,572 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \w+ Compiled 9,636,018.72 ns 1.00 22,716,577 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \w+ Compiled 9,346,380.16 ns 0.97 22,716,540 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \w+ NonBacktracking 17,990,034.19 ns 1.00 22,716,592 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \w+ NonBacktracking 18,537,428.33 ns 1.03 22,716,584 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \w+\s+Holmes None 12,565,884.76 ns 1.00 66,400 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \w+\s+Holmes None 10,438,652.50 ns 0.83 66,414 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \w+\s+Holmes Compiled 3,816,505.65 ns 1.00 66,365 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \w+\s+Holmes Compiled 3,843,176.25 ns 1.01 66,365 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \w+\s+Holmes NonBacktracking 4,129,915.63 ns 1.00 66,364 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \w+\s+Holmes NonBacktracking 4,662,944.47 ns 1.13 66,366 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \w+\s+Holmes\s+\w+ None 12,486,528.72 ns 1.00 28,544 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \w+\s+Holmes\s+\w+ None 10,461,789.63 ns 0.84 28,536 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \w+\s+Holmes\s+\w+ Compiled 3,838,074.88 ns 1.00 28,509 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \w+\s+Holmes\s+\w+ Compiled 3,834,882.29 ns 1.00 28,509 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \w+\s+Holmes\s+\w+ NonBacktracking 4,330,990.46 ns 1.00 28,508 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \w+\s+Holmes\s+\w+ NonBacktracking 4,552,558.88 ns 1.05 28,509 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe aei None 754,303.87 ns 1.00 -
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe aei None 746,433.99 ns 0.99 -
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe aei Compiled 761,881.39 ns 1.00 -
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe aei Compiled 761,182.91 ns 1.00 -
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe aei NonBacktracking 893,414.74 ns 1.00 -
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe aei NonBacktracking 759,851.72 ns 0.85 -
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe aqj None 757,791.11 ns 1.00 -
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe aqj None 748,552.36 ns 0.99 -
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe aqj Compiled 764,630.14 ns 1.00 -
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe aqj Compiled 770,378.82 ns 1.01 -
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe aqj NonBacktracking 738,393.92 ns 1.00 -
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe aqj NonBacktracking 759,543.77 ns 1.03 -
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe the None 1,605,080.76 ns 1.00 1,501,349 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe the None 1,596,498.16 ns 0.99 1,501,349 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe the Compiled 1,398,260.04 ns 1.00 1,501,348 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe the Compiled 1,383,918.27 ns 0.99 1,501,348 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe the NonBacktracking 1,768,233.07 ns 1.00 1,501,349 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe the NonBacktracking 1,694,861.94 ns 0.96 1,501,349 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe the\s+\w+ None 1,964,638.76 ns 1.00 1,125,286 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe the\s+\w+ None 1,830,673.79 ns 0.93 1,125,290 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe the\s+\w+ Compiled 1,405,604.69 ns 1.00 1,125,284 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe the\s+\w+ Compiled 1,408,113.64 ns 1.00 1,125,285 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe the\s+\w+ NonBacktracking 2,533,461.30 ns 1.00 1,125,287 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe the\s+\w+ NonBacktracking 2,440,085.66 ns 0.96 1,125,287 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe zqj None 25,450.52 ns 1.00 -
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe zqj None 24,698.79 ns 0.95 -
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe zqj Compiled 24,252.99 ns 1.00 -
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe zqj Compiled 24,192.44 ns 1.00 -
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe zqj NonBacktracking 707,197.50 ns 1.00 -
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe zqj NonBacktracking 24,004.56 ns 0.03 -
Perf_Regex_Industry_Leipzig Count \main\corerun.exe (?i)Tom|Sawyer|Huckleberry|Finn None 387,378,692.86 ns 1.00 864,336 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe (?i)Tom|Sawyer|Huckleberry|Finn None 404,665,286.67 ns 1.04 864,672 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe (?i)Tom|Sawyer|Huckleberry|Finn Compiled 95,786,800.00 ns 1.00 863,976 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe (?i)Tom|Sawyer|Huckleberry|Finn Compiled 63,912,610.00 ns 0.67 863,880 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe (?i)Tom|Sawyer|Huckleberry|Finn NonBacktracking 89,497,342.31 ns 1.00 863,796 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe (?i)Tom|Sawyer|Huckleberry|Finn NonBacktracking 88,191,775.00 ns 0.99 863,880 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe (?i)Twain None 23,718,807.94 ns 1.00 200,881 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe (?i)Twain None 8,548,322.19 ns 0.36 200,746 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe (?i)Twain Compiled 25,416,325.93 ns 1.00 200,881 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe (?i)Twain Compiled 5,515,463.84 ns 0.22 200,737 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe (?i)Twain NonBacktracking 23,329,646.15 ns 1.00 200,800 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe (?i)Twain NonBacktracking 8,367,159.76 ns 0.36 200,772 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe ([A-Za-z]awyer|[A-Za-z]inn)\s None 1,137,671,226.67 ns 1.00 52,552 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe ([A-Za-z]awyer|[A-Za-z]inn)\s None 902,357,906.67 ns 0.79 52,552 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe ([A-Za-z]awyer|[A-Za-z]inn)\s Compiled 66,055,883.33 ns 1.00 52,012 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe ([A-Za-z]awyer|[A-Za-z]inn)\s Compiled 13,052,931.58 ns 0.20 51,870 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe ([A-Za-z]awyer|[A-Za-z]inn)\s NonBacktracking 147,017,061.54 ns 1.00 44,192 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe ([A-Za-z]awyer|[A-Za-z]inn)\s NonBacktracking 20,017,116.03 ns 0.14 43,532 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe .{0,2}(Tom|Sawyer|Huckleberry|Finn) None 4,966,290,107.69 ns 1.00 645,024 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe .{0,2}(Tom|Sawyer|Huckleberry|Finn) None 4,997,197,992.31 ns 1.01 645,024 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe .{0,2}(Tom|Sawyer|Huckleberry|Finn) Compiled 375,813,600.00 ns 1.00 645,024 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe .{0,2}(Tom|Sawyer|Huckleberry|Finn) Compiled 384,090,378.57 ns 1.02 645,024 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe .{0,2}(Tom|Sawyer|Huckleberry|Finn) NonBacktracking 108,437,021.43 ns 1.00 541,104 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe .{0,2}(Tom|Sawyer|Huckleberry|Finn) NonBacktracking 119,278,042.86 ns 1.10 541,104 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe .{2,4}(Tom|Sawyer|Huckleberry|Finn) None 5,029,933,528.57 ns 1.00 490,768 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe .{2,4}(Tom|Sawyer|Huckleberry|Finn) None 4,978,236,685.71 ns 0.99 490,768 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe .{2,4}(Tom|Sawyer|Huckleberry|Finn) Compiled 380,955,615.38 ns 1.00 491,744 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe .{2,4}(Tom|Sawyer|Huckleberry|Finn) Compiled 380,102,400.00 ns 1.00 491,744 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe .{2,4}(Tom|Sawyer|Huckleberry|Finn) NonBacktracking 113,791,356.25 ns 1.00 411,368 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe .{2,4}(Tom|Sawyer|Huckleberry|Finn) NonBacktracking 121,095,275.00 ns 1.07 411,728 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe Huck[a-zA-Z]+|Saw[a-zA-Z]+ None 62,844,185.71 ns 1.00 54,676 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe Huck[a-zA-Z]+|Saw[a-zA-Z]+ None 4,903,562.55 ns 0.08 54,524 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe Huck[a-zA-Z]+|Saw[a-zA-Z]+ Compiled 2,220,262.43 ns 1.00 54,503 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe Huck[a-zA-Z]+|Saw[a-zA-Z]+ Compiled 2,203,296.15 ns 0.99 54,507 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe Huck[a-zA-Z]+|Saw[a-zA-Z]+ NonBacktracking 3,260,074.27 ns 1.00 54,505 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe Huck[a-zA-Z]+|Saw[a-zA-Z]+ NonBacktracking 2,751,910.99 ns 0.84 54,504 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe Tom.{10,25}river|river.{10,25}Tom None 96,995,090.62 ns 1.00 -
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe Tom.{10,25}river|river.{10,25}Tom None 49,019,228.57 ns 0.51 -
Perf_Regex_Industry_Leipzig Count \main\corerun.exe Tom.{10,25}river|river.{10,25}Tom Compiled 12,024,382.00 ns 1.00 452 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe Tom.{10,25}river|river.{10,25}Tom Compiled 7,659,925.40 ns 0.64 433 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe Tom.{10,25}river|river.{10,25}Tom NonBacktracking 25,348,974.81 ns 1.00 -
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe Tom.{10,25}river|river.{10,25}Tom NonBacktracking 12,004,805.77 ns 0.47 452 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe Tom|Sawyer|Huckleberry|Finn None 71,777,953.33 ns 1.00 540,564 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe Tom|Sawyer|Huckleberry|Finn None 13,551,650.77 ns 0.19 540,432 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe Tom|Sawyer|Huckleberry|Finn Compiled 20,268,520.51 ns 1.00 540,444 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe Tom|Sawyer|Huckleberry|Finn Compiled 4,040,211.15 ns 0.20 540,397 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe Tom|Sawyer|Huckleberry|Finn NonBacktracking 6,005,503.20 ns 1.00 540,418 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe Tom|Sawyer|Huckleberry|Finn NonBacktracking 5,059,554.81 ns 0.84 540,412 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe Twain None 2,496,472.08 ns 1.00 168,695 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe Twain None 2,472,790.84 ns 0.99 168,695 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe Twain Compiled 2,455,009.63 ns 1.00 168,695 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe Twain Compiled 2,462,571.43 ns 1.00 168,695 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe Twain NonBacktracking 16,403,234.87 ns 1.00 168,736 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe Twain NonBacktracking 2,527,594.07 ns 0.15 168,695 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe [a-z]shing None 599,066,058.33 ns 1.00 321,816 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe [a-z]shing None 10,725,073.60 ns 0.02 320,351 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe [a-z]shing Compiled 147,963,307.69 ns 1.00 321,040 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe [a-z]shing Compiled 7,131,160.83 ns 0.05 320,337 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe [a-z]shing NonBacktracking 145,988,333.33 ns 1.00 321,040 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe [a-z]shing NonBacktracking 10,647,451.24 ns 0.07 320,351 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe \p{Sm} None 59,836,651.67 ns 1.00 14,532 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe \p{Sm} None 37,603,825.51 ns 0.63 14,455 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe \p{Sm} Compiled 11,511,310.10 ns 1.00 14,378 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe \p{Sm} Compiled 11,461,300.96 ns 1.00 14,378 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe \p{Sm} NonBacktracking 22,524,769.70 ns 1.00 14,417 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe \p{Sm} NonBacktracking 33,702,615.48 ns 1.50 14,455 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe ∞|✓ None 59,780,462.50 ns 1.00 -
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe ∞|✓ None 1,635,881.41 ns 0.03 424 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe ∞|✓ Compiled 1,594,729.17 ns 1.00 421 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe ∞|✓ Compiled 1,581,152.46 ns 0.99 421 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe ∞|✓ NonBacktracking 1,593,292.99 ns 1.00 434 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe ∞|✓ NonBacktracking 1,588,459.52 ns 1.00 421 B
RegexRedux_1 RegexRedux_1 \main\corerun.exe ? None 41,553,682.14 ns 1.00 2,969,988 B
RegexRedux_1 RegexRedux_1 \pr\corerun.exe ? None 37,636,891.67 ns 0.91 2,997,420 B
RegexRedux_5 RegexRedux_5 \main\corerun.exe ? None 28,241,272.14 ns 1.00 2,798,768 B
RegexRedux_5 RegexRedux_5 \pr\corerun.exe ? None 25,294,893.33 ns 0.90 2,796,740 B
RegexRedux_5 RegexRedux_5 \main\corerun.exe ? Compiled 7,643,919.64 ns 1.00 2,799,742 B
RegexRedux_5 RegexRedux_5 \pr\corerun.exe ? Compiled 6,647,241.64 ns 0.87 2,803,373 B
Perf_Regex_Industry_Mariomka Ctor \main\corerun.exe [\w.+-]+@[\w.-]+.[\w.-]+ None 1,802.79 ns 1.00 3,200 B
Perf_Regex_Industry_Mariomka Ctor \pr\corerun.exe [\w.+-]+@[\w.-]+.[\w.-]+ None 1,739.21 ns 0.96 2,776 B
Perf_Regex_Industry_Mariomka Count \main\corerun.exe [\w.+-]+@[\w.-]+.[\w.-]+ None 95,420,267.86 ns 1.00 19,496 B
Perf_Regex_Industry_Mariomka Count \pr\corerun.exe [\w.+-]+@[\w.-]+.[\w.-]+ None 87,752,300.00 ns 0.92 19,316 B
Perf_Regex_Industry_Mariomka Ctor \main\corerun.exe [\w.+-]+@[\w.-]+.[\w.-]+ Compiled 18,857.49 ns 1.00 12,656 B
Perf_Regex_Industry_Mariomka Ctor \pr\corerun.exe [\w.+-]+@[\w.-]+.[\w.-]+ Compiled 18,631.30 ns 0.99 12,184 B
Perf_Regex_Industry_Mariomka Count \main\corerun.exe [\w.+-]+@[\w.-]+.[\w.-]+ Compiled 43,516,983.33 ns 1.00 19,256 B
Perf_Regex_Industry_Mariomka Count \pr\corerun.exe [\w.+-]+@[\w.-]+.[\w.-]+ Compiled 43,390,845.83 ns 1.00 19,256 B
Perf_Regex_Industry_Mariomka Ctor \main\corerun.exe [\w.+-]+@[\w.-]+.[\w.-]+ NonBacktracking 381,762.44 ns 1.00 310,025 B
Perf_Regex_Industry_Mariomka Ctor \pr\corerun.exe [\w.+-]+@[\w.-]+.[\w.-]+ NonBacktracking 378,707.92 ns 0.99 307,937 B
Perf_Regex_Industry_Mariomka Count \main\corerun.exe [\w.+-]+@[\w.-]+.[\w.-]+ NonBacktracking 58,316,891.67 ns 1.00 19,316 B
Perf_Regex_Industry_Mariomka Count \pr\corerun.exe [\w.+-]+@[\w.-]+.[\w.-]+ NonBacktracking 66,558,896.43 ns 1.14 19,316 B
Perf_Regex_Industry_Mariomka Ctor \main\corerun.exe [\w]+://[^/\s(...)?(?:#[^\s]*)? [51] None 3,139.49 ns 1.00 4,848 B
Perf_Regex_Industry_Mariomka Ctor \pr\corerun.exe [\w]+://[^/\s(...)?(?:#[^\s]*)? [51] None 3,039.44 ns 0.97 4,504 B
Perf_Regex_Industry_Mariomka Count \main\corerun.exe [\w]+://[^/\s(...)?(?:#[^\s]*)? [51] None 97,749,153.33 ns 1.00 1,102,968 B
Perf_Regex_Industry_Mariomka Count \pr\corerun.exe [\w]+://[^/\s(...)?(?:#[^\s]*)? [51] None 85,637,781.67 ns 0.88 1,102,788 B
Perf_Regex_Industry_Mariomka Ctor \main\corerun.exe [\w]+://[^/\s(...)?(?:#[^\s]*)? [51] Compiled 38,322.31 ns 1.00 26,617 B
Perf_Regex_Industry_Mariomka Ctor \pr\corerun.exe [\w]+://[^/\s(...)?(?:#[^\s]*)? [51] Compiled 38,197.63 ns 1.00 26,224 B
Perf_Regex_Industry_Mariomka Count \main\corerun.exe [\w]+://[^/\s(...)?(?:#[^\s]*)? [51] Compiled 46,282,289.29 ns 1.00 1,102,788 B
Perf_Regex_Industry_Mariomka Count \pr\corerun.exe [\w]+://[^/\s(...)?(?:#[^\s]*)? [51] Compiled 46,220,502.08 ns 1.00 1,102,788 B
Perf_Regex_Industry_Mariomka Ctor \main\corerun.exe [\w]+://[^/\s(...)?(?:#[^\s]*)? [51] NonBacktracking 405,126.79 ns 1.00 343,774 B
Perf_Regex_Industry_Mariomka Ctor \pr\corerun.exe [\w]+://[^/\s(...)?(?:#[^\s]*)? [51] NonBacktracking 403,840.97 ns 1.00 341,761 B
Perf_Regex_Industry_Mariomka Count \main\corerun.exe [\w]+://[^/\s(...)?(?:#[^\s]*)? [51] NonBacktracking 59,939,631.67 ns 1.00 1,102,788 B
Perf_Regex_Industry_Mariomka Count \pr\corerun.exe [\w]+://[^/\s(...)?(?:#[^\s]*)? [51] NonBacktracking 68,354,913.33 ns 1.14 1,102,788 B
Perf_Regex_Industry_Mariomka Ctor \main\corerun.exe (?:(?:250-5]?[0-9][0-9]) [87] None 6,482.24 ns 1.00 8,080 B
Perf_Regex_Industry_Mariomka Ctor \pr\corerun.exe (?:(?:250-5]?[0-9][0-9]) [87] None 7,115.57 ns 1.10 8,280 B
Perf_Regex_Industry_Mariomka Count \main\corerun.exe (?:(?:250-5]?[0-9][0-9]) [87] None 38,004,650.00 ns 1.00 -
Perf_Regex_Industry_Mariomka Count \pr\corerun.exe (?:(?:250-5]?[0-9][0-9]) [87] None 28,049,133.67 ns 0.74 1,191 B
Perf_Regex_Industry_Mariomka Ctor \main\corerun.exe (?:(?:250-5]?[0-9][0-9]) [87] Compiled 23,165.01 ns 1.00 23,208 B
Perf_Regex_Industry_Mariomka Ctor \pr\corerun.exe (?:(?:250-5]?[0-9][0-9]) [87] Compiled 25,439.48 ns 1.10 25,056 B
Perf_Regex_Industry_Mariomka Count \main\corerun.exe (?:(?:250-5]?[0-9][0-9]) [87] Compiled 6,370,831.99 ns 1.00 1,064 B
Perf_Regex_Industry_Mariomka Count \pr\corerun.exe (?:(?:250-5]?[0-9][0-9]) [87] Compiled 6,350,644.31 ns 1.00 1,064 B
Perf_Regex_Industry_Mariomka Ctor \main\corerun.exe (?:(?:250-5]?[0-9][0-9]) [87] NonBacktracking 87,644.59 ns 1.00 149,648 B
Perf_Regex_Industry_Mariomka Ctor \pr\corerun.exe (?:(?:250-5]?[0-9][0-9]) [87] NonBacktracking 86,663.11 ns 0.99 149,761 B
Perf_Regex_Industry_Mariomka Count \main\corerun.exe (?:(?:250-5]?[0-9][0-9]) [87] NonBacktracking 12,839,413.91 ns 1.00 1,078 B
Perf_Regex_Industry_Mariomka Count \pr\corerun.exe (?:(?:250-5]?[0-9][0-9]) [87] NonBacktracking 20,377,364.29 ns 1.59 1,172 B
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 62.76 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 65.89 ns 1.05 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 40.85 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 40.91 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 60.50 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 87.16 ns 1.44 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 161.46 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 154.61 ns 0.96 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 73.30 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 74.59 ns 1.02 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 687.45 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 795.49 ns 1.16 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 271.85 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 246.07 ns 0.91 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 97.16 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 102.06 ns 1.05 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 178.90 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 215.75 ns 1.21 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 455.16 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 385.55 ns 0.85 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 140.98 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 141.24 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 246.23 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 272.41 ns 1.11 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 378.95 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 308.17 ns 0.81 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 123.57 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 123.34 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 173.93 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 184.33 ns 1.06 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 379.94 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 340.22 ns 0.90 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 125.34 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 125.96 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 193.62 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 212.19 ns 1.10 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 128.85 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 116.89 ns 0.91 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 42.61 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 43.78 ns 1.03 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 128.33 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 135.73 ns 1.06 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 125.60 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 116.10 ns 0.92 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 42.59 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 42.88 ns 1.01 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 105.04 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 111.33 ns 1.06 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 125.07 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 117.37 ns 0.94 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 41.76 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 43.25 ns 1.04 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 111.49 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 127.97 ns 1.15 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 134.56 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 112.85 ns 0.84 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 40.26 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 40.11 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 131.19 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 137.44 ns 1.04 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 135.09 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 116.08 ns 0.86 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 41.20 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 41.21 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 141.80 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 158.57 ns 1.12 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 97.53 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 90.09 ns 0.92 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 38.86 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 38.74 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 85.60 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 89.90 ns 1.05 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 125.16 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 111.89 ns 0.89 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 44.82 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 44.80 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 139.00 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 149.30 ns 1.07 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 124.67 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 111.90 ns 0.90 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 44.98 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 44.89 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 138.01 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 150.78 ns 1.09 -
Perf_Regex_Cache IsMatch \main\corerun.exe ? ? 36,280,917.50 ns 1.00 107,200,120 B
Perf_Regex_Cache IsMatch \pr\corerun.exe ? ? 36,889,390.00 ns 1.02 96,000,120 B
Perf_Regex_Cache IsMatch_Multithreading \main\corerun.exe ? ? 12,761,217.00 ns 1.00 107,201,136 B
Perf_Regex_Cache IsMatch_Multithreading \pr\corerun.exe ? ? 13,376,354.51 ns 1.05 96,001,191 B
Perf_Regex_Cache IsMatch \main\corerun.exe ? ? 81,442,280.00 ns 1.00 167,802,952 B
Perf_Regex_Cache IsMatch \pr\corerun.exe ? ? 86,256,273.33 ns 1.06 156,706,832 B
Perf_Regex_Cache IsMatch_Multithreading \main\corerun.exe ? ? 30,305,710.26 ns 1.00 167,729,155 B
Perf_Regex_Cache IsMatch_Multithreading \pr\corerun.exe ? ? 30,574,329.76 ns 1.01 156,658,415 B
Perf_Regex_Cache IsMatch \main\corerun.exe ? ? 69,044,760.00 ns 1.00 87,588,848 B
Perf_Regex_Cache IsMatch \pr\corerun.exe ? ? 70,905,162.50 ns 1.03 81,324,192 B
Perf_Regex_Cache IsMatch_Multithreading \main\corerun.exe ? ? 47,851,511.25 ns 1.00 87,702,890 B
Perf_Regex_Cache IsMatch_Multithreading \pr\corerun.exe ? ? 45,735,085.00 ns 0.96 81,969,042 B
Perf_Regex_Cache IsMatch \main\corerun.exe ? ? 10,561,671.87 ns 1.00 -
Perf_Regex_Cache IsMatch \pr\corerun.exe ? ? 9,933,559.23 ns 0.93 -
Perf_Regex_Cache IsMatch_Multithreading \main\corerun.exe ? ? 3,997,190.25 ns 1.00 61,736 B
Perf_Regex_Cache IsMatch_Multithreading \pr\corerun.exe ? ? 3,979,859.55 ns 1.00 60,089 B
Perf_Regex_Cache IsMatch \main\corerun.exe ? ? 38,446,023.08 ns 1.00 -
Perf_Regex_Cache IsMatch \pr\corerun.exe ? ? 38,502,030.36 ns 1.00 -
Perf_Regex_Cache IsMatch_Multithreading \main\corerun.exe ? ? 35,723,650.00 ns 1.00 61,161,464 B
Perf_Regex_Cache IsMatch_Multithreading \pr\corerun.exe ? ? 35,247,306.48 ns 0.99 68,409,013 B
Perf_Regex_Cache IsMatch \main\corerun.exe ? ? 51,511,911.54 ns 1.00 -
Perf_Regex_Cache IsMatch \pr\corerun.exe ? ? 50,659,253.33 ns 0.98 -
Perf_Regex_Cache IsMatch_Multithreading \main\corerun.exe ? ? 40,094,616.25 ns 1.00 49,705,372 B
Perf_Regex_Cache IsMatch_Multithreading \pr\corerun.exe ? ? 39,284,054.17 ns 0.98 59,197,761 B
Perf_Regex_Common Backtracking \main\corerun.exe ? Compiled 163.01 ns 1.00 248 B
Perf_Regex_Common Backtracking \pr\corerun.exe ? Compiled 162.43 ns 1.00 248 B
Perf_Regex_Common OneNodeBacktracking \main\corerun.exe ? Compiled 832.26 ns 1.00 -
Perf_Regex_Common OneNodeBacktracking \pr\corerun.exe ? Compiled 836.37 ns 1.00 -
Perf_Regex_Common Email_IsMatch \main\corerun.exe ? Compiled 139.34 ns 1.00 -
Perf_Regex_Common Email_IsMatch \pr\corerun.exe ? Compiled 138.68 ns 1.00 -
Perf_Regex_Common Email_IsNotMatch \main\corerun.exe ? Compiled 206.52 ns 1.00 -
Perf_Regex_Common Email_IsNotMatch \pr\corerun.exe ? Compiled 204.28 ns 0.99 -
Perf_Regex_Common Date_IsMatch \main\corerun.exe ? Compiled 63.72 ns 1.00 -
Perf_Regex_Common Date_IsMatch \pr\corerun.exe ? Compiled 63.68 ns 1.00 -
Perf_Regex_Common Date_IsNotMatch \main\corerun.exe ? Compiled 117.46 ns 1.00 -
Perf_Regex_Common Date_IsNotMatch \pr\corerun.exe ? Compiled 117.10 ns 1.00 -
Perf_Regex_Common IP_IsMatch \main\corerun.exe ? Compiled 175.79 ns 1.00 -
Perf_Regex_Common IP_IsMatch \pr\corerun.exe ? Compiled 170.89 ns 0.97 -
Perf_Regex_Common IP_IsNotMatch \main\corerun.exe ? Compiled 172.14 ns 1.00 -
Perf_Regex_Common IP_IsNotMatch \pr\corerun.exe ? Compiled 169.62 ns 0.99 -
Perf_Regex_Common Uri_IsMatch \main\corerun.exe ? Compiled 98.32 ns 1.00 -
Perf_Regex_Common Uri_IsMatch \pr\corerun.exe ? Compiled 97.08 ns 0.99 -
Perf_Regex_Common Uri_IsNotMatch \main\corerun.exe ? Compiled 111.65 ns 1.00 -
Perf_Regex_Common Uri_IsNotMatch \pr\corerun.exe ? Compiled 110.41 ns 0.99 -
Perf_Regex_Common MatchesSet \main\corerun.exe ? Compiled 53,520.11 ns 1.00 6,696 B
Perf_Regex_Common MatchesSet \pr\corerun.exe ? Compiled 47,569.43 ns 0.89 6,696 B
Perf_Regex_Common MatchesBoundary \main\corerun.exe ? Compiled 57,333.98 ns 1.00 6,696 B
Perf_Regex_Common MatchesBoundary \pr\corerun.exe ? Compiled 47,398.43 ns 0.83 6,696 B
Perf_Regex_Common MatchesWord \main\corerun.exe ? Compiled 2,394.39 ns 1.00 1,480 B
Perf_Regex_Common MatchesWord \pr\corerun.exe ? Compiled 2,402.48 ns 1.01 1,480 B
Perf_Regex_Common MatchesWords \main\corerun.exe ? Compiled 6,161.95 ns 1.00 3,504 B
Perf_Regex_Common MatchesWords \pr\corerun.exe ? Compiled 2,368.01 ns 0.38 3,504 B
Perf_Regex_Common MatchWord \main\corerun.exe ? Compiled 182.13 ns 1.00 208 B
Perf_Regex_Common MatchWord \pr\corerun.exe ? Compiled 111.33 ns 0.61 208 B
Perf_Regex_Common ReplaceWords \main\corerun.exe ? Compiled 6,139.28 ns 1.00 6,848 B
Perf_Regex_Common ReplaceWords \pr\corerun.exe ? Compiled 2,302.15 ns 0.38 6,848 B
Perf_Regex_Common SplitWords \main\corerun.exe ? Compiled 6,014.93 ns 1.00 7,432 B
Perf_Regex_Common SplitWords \pr\corerun.exe ? Compiled 2,177.28 ns 0.36 7,432 B
Perf_Regex_Common Ctor \main\corerun.exe ? Compiled 24,304.05 ns 1.00 27,704 B
Perf_Regex_Common Ctor \pr\corerun.exe ? Compiled 22,017.27 ns 0.91 26,192 B
Perf_Regex_Common CtorInvoke \main\corerun.exe ? Compiled 117,871.80 ns 1.00 30,678 B
Perf_Regex_Common CtorInvoke \pr\corerun.exe ? Compiled 106,120.75 ns 0.90 29,068 B
Perf_Regex_Common Backtracking \main\corerun.exe ? IgnoreCase, Compiled 338.38 ns 1.00 248 B
Perf_Regex_Common Backtracking \pr\corerun.exe ? IgnoreCase, Compiled 182.80 ns 0.54 248 B
Perf_Regex_Common OneNodeBacktracking \main\corerun.exe ? IgnoreCase, Compiled 1,572.31 ns 1.00 -
Perf_Regex_Common OneNodeBacktracking \pr\corerun.exe ? IgnoreCase, Compiled 1,609.75 ns 1.02 -
Perf_Regex_Common Email_IsMatch \main\corerun.exe ? IgnoreCase, Compiled 205.08 ns 1.00 -
Perf_Regex_Common Email_IsMatch \pr\corerun.exe ? IgnoreCase, Compiled 204.21 ns 0.99 -
Perf_Regex_Common Email_IsNotMatch \main\corerun.exe ? IgnoreCase, Compiled 284.11 ns 1.00 -
Perf_Regex_Common Email_IsNotMatch \pr\corerun.exe ? IgnoreCase, Compiled 465.74 ns 1.64 -
Perf_Regex_Common Date_IsMatch \main\corerun.exe ? IgnoreCase, Compiled 77.45 ns 1.00 -
Perf_Regex_Common Date_IsMatch \pr\corerun.exe ? IgnoreCase, Compiled 72.86 ns 0.94 -
Perf_Regex_Common Date_IsNotMatch \main\corerun.exe ? IgnoreCase, Compiled 179.35 ns 1.00 -
Perf_Regex_Common Date_IsNotMatch \pr\corerun.exe ? IgnoreCase, Compiled 155.91 ns 0.87 -
Perf_Regex_Common IP_IsMatch \main\corerun.exe ? IgnoreCase, Compiled 288.47 ns 1.00 -
Perf_Regex_Common IP_IsMatch \pr\corerun.exe ? IgnoreCase, Compiled 174.70 ns 0.60 -
Perf_Regex_Common IP_IsNotMatch \main\corerun.exe ? IgnoreCase, Compiled 274.28 ns 1.00 -
Perf_Regex_Common IP_IsNotMatch \pr\corerun.exe ? IgnoreCase, Compiled 175.90 ns 0.64 -
Perf_Regex_Common Uri_IsMatch \main\corerun.exe ? IgnoreCase, Compiled 143.39 ns 1.00 -
Perf_Regex_Common Uri_IsMatch \pr\corerun.exe ? IgnoreCase, Compiled 142.52 ns 0.99 -
Perf_Regex_Common Uri_IsNotMatch \main\corerun.exe ? IgnoreCase, Compiled 190.72 ns 1.00 -
Perf_Regex_Common Uri_IsNotMatch \pr\corerun.exe ? IgnoreCase, Compiled 337.76 ns 1.77 -
Perf_Regex_Common MatchesSet \main\corerun.exe ? IgnoreCase, Compiled 102,966.36 ns 1.00 6,696 B
Perf_Regex_Common MatchesSet \pr\corerun.exe ? IgnoreCase, Compiled 57,836.41 ns 0.56 6,696 B
Perf_Regex_Common MatchesBoundary \main\corerun.exe ? IgnoreCase, Compiled 99,719.82 ns 1.00 6,696 B
Perf_Regex_Common MatchesBoundary \pr\corerun.exe ? IgnoreCase, Compiled 58,803.43 ns 0.59 6,696 B
Perf_Regex_Common MatchesWord \main\corerun.exe ? IgnoreCase, Compiled 3,296.76 ns 1.00 1,480 B
Perf_Regex_Common MatchesWord \pr\corerun.exe ? IgnoreCase, Compiled 1,483.23 ns 0.45 1,480 B
Perf_Regex_Common MatchesWords \main\corerun.exe ? IgnoreCase, Compiled 17,183.53 ns 1.00 3,504 B
Perf_Regex_Common MatchesWords \pr\corerun.exe ? IgnoreCase, Compiled 3,085.54 ns 0.18 3,504 B
Perf_Regex_Common MatchWord \main\corerun.exe ? IgnoreCase, Compiled 408.74 ns 1.00 208 B
Perf_Regex_Common MatchWord \pr\corerun.exe ? IgnoreCase, Compiled 142.45 ns 0.35 208 B
Perf_Regex_Common ReplaceWords \main\corerun.exe ? IgnoreCase, Compiled 14,457.45 ns 1.00 6,848 B
Perf_Regex_Common ReplaceWords \pr\corerun.exe ? IgnoreCase, Compiled 3,074.16 ns 0.21 6,848 B
Perf_Regex_Common SplitWords \main\corerun.exe ? IgnoreCase, Compiled 14,659.64 ns 1.00 7,432 B
Perf_Regex_Common SplitWords \pr\corerun.exe ? IgnoreCase, Compiled 2,864.13 ns 0.20 7,432 B
Perf_Regex_Common Ctor \main\corerun.exe ? IgnoreCase, Compiled 30,940.34 ns 1.00 29,968 B
Perf_Regex_Common Ctor \pr\corerun.exe ? IgnoreCase, Compiled 30,597.55 ns 0.99 30,688 B
Perf_Regex_Common CtorInvoke \main\corerun.exe ? IgnoreCase, Compiled 168,305.30 ns 1.00 33,310 B
Perf_Regex_Common CtorInvoke \pr\corerun.exe ? IgnoreCase, Compiled 123,219.24 ns 0.73 34,008 B
Perf_Regex_Common Backtracking \main\corerun.exe ? None 1,456.25 ns 1.00 248 B
Perf_Regex_Common Backtracking \pr\corerun.exe ? None 1,426.05 ns 0.98 248 B
Perf_Regex_Common OneNodeBacktracking \main\corerun.exe ? None 5,649.41 ns 1.00 -
Perf_Regex_Common OneNodeBacktracking \pr\corerun.exe ? None 5,528.62 ns 0.98 -
Perf_Regex_Common Email_IsMatch \main\corerun.exe ? None 447.34 ns 1.00 -
Perf_Regex_Common Email_IsMatch \pr\corerun.exe ? None 363.43 ns 0.81 -
Perf_Regex_Common Email_IsNotMatch \main\corerun.exe ? None 731.32 ns 1.00 -
Perf_Regex_Common Email_IsNotMatch \pr\corerun.exe ? None 683.95 ns 0.94 -
Perf_Regex_Common Date_IsMatch \main\corerun.exe ? None 179.07 ns 1.00 -
Perf_Regex_Common Date_IsMatch \pr\corerun.exe ? None 157.20 ns 0.88 -
Perf_Regex_Common Date_IsNotMatch \main\corerun.exe ? None 408.42 ns 1.00 -
Perf_Regex_Common Date_IsNotMatch \pr\corerun.exe ? None 352.61 ns 0.86 -
Perf_Regex_Common IP_IsMatch \main\corerun.exe ? None 635.05 ns 1.00 -
Perf_Regex_Common IP_IsMatch \pr\corerun.exe ? None 587.15 ns 0.92 -
Perf_Regex_Common IP_IsNotMatch \main\corerun.exe ? None 637.63 ns 1.00 -
Perf_Regex_Common IP_IsNotMatch \pr\corerun.exe ? None 589.94 ns 0.93 -
Perf_Regex_Common Uri_IsMatch \main\corerun.exe ? None 290.58 ns 1.00 -
Perf_Regex_Common Uri_IsMatch \pr\corerun.exe ? None 252.66 ns 0.87 -
Perf_Regex_Common Uri_IsNotMatch \main\corerun.exe ? None 346.54 ns 1.00 -
Perf_Regex_Common Uri_IsNotMatch \pr\corerun.exe ? None 293.83 ns 0.85 -
Perf_Regex_Common MatchesSet \main\corerun.exe ? None 179,077.37 ns 1.00 6,697 B
Perf_Regex_Common MatchesSet \pr\corerun.exe ? None 132,097.01 ns 0.74 6,696 B
Perf_Regex_Common MatchesBoundary \main\corerun.exe ? None 135,424.94 ns 1.00 6,696 B
Perf_Regex_Common MatchesBoundary \pr\corerun.exe ? None 113,965.33 ns 0.84 6,697 B
Perf_Regex_Common MatchesWord \main\corerun.exe ? None 2,593.70 ns 1.00 1,480 B
Perf_Regex_Common MatchesWord \pr\corerun.exe ? None 2,590.69 ns 1.00 1,480 B
Perf_Regex_Common MatchesWords \main\corerun.exe ? None 65,701.25 ns 1.00 3,504 B
Perf_Regex_Common MatchesWords \pr\corerun.exe ? None 51,628.86 ns 0.78 3,504 B
Perf_Regex_Common MatchWord \main\corerun.exe ? None 1,680.69 ns 1.00 208 B
Perf_Regex_Common MatchWord \pr\corerun.exe ? None 1,369.82 ns 0.82 208 B
Perf_Regex_Common ReplaceWords \main\corerun.exe ? None 65,371.10 ns 1.00 6,849 B
Perf_Regex_Common ReplaceWords \pr\corerun.exe ? None 53,501.68 ns 0.81 6,848 B
Perf_Regex_Common SplitWords \main\corerun.exe ? None 66,615.21 ns 1.00 7,433 B
Perf_Regex_Common SplitWords \pr\corerun.exe ? None 50,404.24 ns 0.76 7,432 B
Perf_Regex_Common Ctor \main\corerun.exe ? None 5,296.62 ns 1.00 7,552 B
Perf_Regex_Common Ctor \pr\corerun.exe ? None 4,813.12 ns 0.91 6,744 B
Perf_Regex_Common CtorInvoke \main\corerun.exe ? None 5,270.26 ns 1.00 7,696 B
Perf_Regex_Common CtorInvoke \pr\corerun.exe ? None 4,784.73 ns 0.91 6,880 B

@ghost
Copy link

ghost commented Nov 12, 2021

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.

Type Method Toolchain Pattern Options Mean Ratio Allocated
Perf_Regex_Industry_SliceSlice Count \main\corerun.exe ? IgnoreCase 5,919,020,750.00 ns 1.00 229,137,752 B
Perf_Regex_Industry_SliceSlice Count \pr\corerun.exe ? IgnoreCase 2,655,622,120.00 ns 0.45 229,135,392 B
Perf_Regex_Industry_SliceSlice Count \main\corerun.exe ? IgnoreCase, Compiled 5,980,794,825.00 ns 1.00 229,135,392 B
Perf_Regex_Industry_SliceSlice Count \pr\corerun.exe ? IgnoreCase, Compiled 1,709,189,240.00 ns 0.29 229,135,392 B
Perf_Regex_Industry_SliceSlice Count \main\corerun.exe ? IgnoreCase, NonBacktracking 6,274,067,325.00 ns 1.00 229,135,392 B
Perf_Regex_Industry_SliceSlice Count \pr\corerun.exe ? IgnoreCase, NonBacktracking 2,792,333,450.00 ns 0.45 229,135,392 B
Perf_Regex_Industry_SliceSlice Count \main\corerun.exe ? None 3,769,231,500.00 ns 1.00 114,408,208 B
Perf_Regex_Industry_SliceSlice Count \pr\corerun.exe ? None 3,714,378,675.00 ns 0.99 114,408,208 B
Perf_Regex_Industry_SliceSlice Count \main\corerun.exe ? Compiled 3,706,293,650.00 ns 1.00 150,863,280 B
Perf_Regex_Industry_SliceSlice Count \pr\corerun.exe ? Compiled 3,710,450,780.00 ns 1.00 114,408,160 B
Perf_Regex_Industry_SliceSlice Count \main\corerun.exe ? NonBacktracking 4,208,438,720.00 ns 1.00 114,408,208 B
Perf_Regex_Industry_SliceSlice Count \pr\corerun.exe ? NonBacktracking 3,745,114,350.00 ns 0.89 114,408,208 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Holmes None 789,132.09 ns 1.00 97,138 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Holmes None 688,469.87 ns 0.87 97,138 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Holmes Compiled 808,262.69 ns 1.00 97,138 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Holmes Compiled 417,193.55 ns 0.52 97,137 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Holmes NonBacktracking 725,918.41 ns 1.00 97,138 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Holmes NonBacktracking 685,504.44 ns 0.94 97,140 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sher[a-z]+ Hol[a-z]+ None 6,870,657.12 ns 1.00
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sher[a-z]+ Hol[a-z]+ None 4,824,624.36 ns 0.70
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sher[a-z]+ Hol[a-z]+ Compiled 2,258,139.88 ns 1.00
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sher[a-z]+ Hol[a-z]+ Compiled 825,089.83 ns 0.37
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sher[a-z]+ Hol[a-z]+ NonBacktracking 1,890,083.74 ns 1.00
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sher[a-z]+ Hol[a-z]+ NonBacktracking 1,388,542.11 ns 0.73
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sherlock None 471,244.46 ns 1.00 21,217 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sherlock None 150,869.37 ns 0.32 21,216 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sherlock Compiled 523,646.53 ns 1.00 21,218 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sherlock Compiled 99,295.06 ns 0.19 21,216 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sherlock NonBacktracking 454,725.55 ns 1.00 21,217 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sherlock NonBacktracking 144,565.38 ns 0.32 21,217 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sherlock Holmes None 400,282.70 ns 1.00 19,970 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sherlock Holmes None 148,763.96 ns 0.37 19,968 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sherlock Holmes Compiled 320,484.07 ns 1.00 19,969 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sherlock Holmes Compiled 97,347.57 ns 0.30 19,968 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sherlock Holmes NonBacktracking 374,497.60 ns 1.00 19,969 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sherlock Holmes NonBacktracking 148,935.01 ns 0.40 19,968 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sherlock Holmes Watson None 9,336,569.80 ns
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sherlock Holmes Watson None 8,944,893.54 ns
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sherlock Holmes Watson Compiled 2,388,718.93 ns
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sherlock Holmes Watson Compiled 1,685,141.16 ns
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sherlock Holmes Watson NonBacktracking 2,627,173.71 ns
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sherlock Holmes Watson NonBacktracking 3,059,709.81 ns
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sherlock (...)er John Baker [49] None
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sherlock (...)er John Baker [49] None
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sherlock (...)er John Baker [49] Compiled
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sherlock (...)er John Baker [49] Compiled
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)Sherlock (...)er John Baker [49] NonBacktracking
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)Sherlock (...)er John Baker [49] NonBacktracking
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)the None 2,482,717.44 ns 1.00 1,661,303 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)the None 1,693,418.30 ns 0.68 1,661,301 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)the Compiled 2,410,350.89 ns 1.00 1,661,305 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)the Compiled 1,031,249.35 ns 0.43 1,661,299 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?i)the NonBacktracking 2,272,962.31 ns 1.00 1,661,303 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?i)the NonBacktracking 1,699,628.91 ns 0.75 1,661,301 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?m)^Sherlock(...)rlock Holmes$ [37] None 87,770.03 ns 1.00 7,072 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?m)^Sherlock(...)rlock Holmes$ [37] None 49,695.90 ns 0.57 7,072 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?m)^Sherlock(...)rlock Holmes$ [37] Compiled 52,439.39 ns 1.00 7,072 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?m)^Sherlock(...)rlock Holmes$ [37] Compiled 44,650.20 ns 0.85 7,072 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?m)^Sherlock(...)rlock Holmes$ [37] NonBacktracking 83,746.07 ns 1.00 10,097 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?m)^Sherlock(...)rlock Holmes$ [37] NonBacktracking 62,438.20 ns 0.74 7,960 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?s).* None 3,048,148.21 ns 1.00 425 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?s).* None 2,029,877.99 ns 0.67 422 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?s).* Compiled 137.61 ns 1.00 416 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?s).* Compiled 136.19 ns 0.99 416 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe (?s).* NonBacktracking 4,272,951.28 ns 1.00 431 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe (?s).* NonBacktracking 3,870,547.32 ns 0.91 429 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe .* None 2,514,522.64 ns 1.00 5,429,847 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe .* None 2,566,864.44 ns 1.02 5,429,851 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe .* Compiled 1,961,965.35 ns 1.00 5,429,846 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe .* Compiled 1,900,608.07 ns 0.97 5,429,848 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe .* NonBacktracking 6,330,598.07 ns 1.00 5,429,859 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe .* NonBacktracking 6,582,895.41 ns 1.04 5,429,866 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Holmes None 99,887.36 ns 1.00 95,888 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Holmes None 101,882.18 ns 1.02 95,888 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Holmes Compiled 88,257.94 ns 1.00 95,888 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Holmes Compiled 86,498.28 ns 0.98 95,888 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Holmes NonBacktracking 534,754.92 ns 1.00 95,890 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Holmes NonBacktracking 119,285.84 ns 0.22 95,890 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Holmes.{0,25}(...).{0,25}Holmes [39] None 2,292,453.21 ns 1.00 1,463 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Holmes.{0,25}(...).{0,25}Holmes [39] None 359,811.76 ns 0.16 1,457 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Holmes.{0,25}(...).{0,25}Holmes [39] Compiled 134,305.47 ns 1.00 1,456 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Holmes.{0,25}(...).{0,25}Holmes [39] Compiled 132,236.00 ns 0.98 1,456 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Holmes.{0,25}(...).{0,25}Holmes [39] NonBacktracking 208,517.33 ns 1.00 1,457 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Holmes.{0,25}(...).{0,25}Holmes [39] NonBacktracking 204,748.72 ns 0.98 1,457 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sher[a-z]+ Hol[a-z]+ None 2,160,430.30 ns 1.00
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sher[a-z]+ Hol[a-z]+ None 222,265.19 ns 0.10
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sher[a-z]+ Hol[a-z]+ Compiled 103,542.56 ns 1.00
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sher[a-z]+ Hol[a-z]+ Compiled 106,307.18 ns 1.03
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sher[a-z]+ Hol[a-z]+ NonBacktracking 235,204.99 ns 1.00
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sher[a-z]+ Hol[a-z]+ NonBacktracking 225,376.41 ns 0.96
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock None 50,969.53 ns 1.00 20,176 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock None 51,119.21 ns 1.00 20,176 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock Compiled 48,287.55 ns 1.00 20,176 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock Compiled 47,980.76 ns 0.99 20,176 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock NonBacktracking 341,080.91 ns 1.00 20,177 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock NonBacktracking 57,424.63 ns 0.17 20,177 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock Holmes None 51,047.67 ns 1.00 18,928 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock Holmes None 53,062.79 ns 1.04 18,928 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock Holmes Compiled 47,868.40 ns 1.00 18,928 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock Holmes Compiled 48,583.45 ns 1.02 18,928 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock Holmes NonBacktracking 272,257.62 ns 1.00 18,929 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock Holmes NonBacktracking 62,228.65 ns 0.23 18,929 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock\s+Holmes None 54,741.68 ns 1.00 20,176 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock\s+Holmes None 54,947.28 ns 1.01 20,176 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock\s+Holmes Compiled 48,400.44 ns 1.00 20,176 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock\s+Holmes Compiled 48,139.39 ns 0.99 20,176 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock\s+Holmes NonBacktracking 368,725.29 ns 1.00 20,177 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock\s+Holmes NonBacktracking 90,658.24 ns 0.25 20,176 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock Holmes None 2,125,098.17 ns 1.00
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock Holmes None 207,549.09 ns 0.10
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock Holmes Compiled 101,719.84 ns 1.00
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock Holmes Compiled 100,942.91 ns 0.99
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock Holmes NonBacktracking 174,869.17 ns 1.00
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock Holmes NonBacktracking 167,204.46 ns 0.96
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock Holmes Watson None 2,515,241.57 ns
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock Holmes Watson None 348,264.09 ns
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock Holmes Watson Compiled 140,145.51 ns
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock Holmes Watson Compiled 137,239.30 ns
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock Holmes Watson NonBacktracking 218,512.11 ns
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock Holmes Watson NonBacktracking 220,536.51 ns
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock Holm(...)er John Baker [45] None
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock Holm(...)er John Baker [45] None
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock Holm(...)er John Baker [45] Compiled
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock Holm(...)er John Baker [45] Compiled
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock Holm(...)er John Baker [45] NonBacktracking
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock Holm(...)er John Baker [45] NonBacktracking
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock Street None 106,161.14 ns 1.00
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock Street None 111,006.55 ns 1.05
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock Street Compiled 60,754.20 ns 1.00
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock Street Compiled 57,936.28 ns 0.96
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe Sherlock Street NonBacktracking 128,014.67 ns 1.00
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe Sherlock Street NonBacktracking 112,557.51 ns 0.89
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe The None 126,093.97 ns 1.00 154,130 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe The None 122,884.38 ns 0.97 154,128 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe The Compiled 106,029.27 ns 1.00 154,128 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe The Compiled 106,163.97 ns 1.00 154,128 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe The NonBacktracking 1,155,649.71 ns 1.00 154,131 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe The NonBacktracking 139,228.02 ns 0.12 154,128 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe [^\n]* None 2,629,307.54 ns 1.00 5,429,847 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe [^\n]* None 2,561,391.44 ns 0.97 5,429,847 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe [^\n]* Compiled 2,028,577.34 ns 1.00 5,429,848 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe [^\n]* Compiled 1,990,132.75 ns 0.98 5,429,848 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe [^\n]* NonBacktracking 6,431,206.78 ns 1.00 5,429,858 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe [^\n]* NonBacktracking 6,572,198.42 ns 1.02 5,429,859 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe [a-q][^u-z]{13}x None 34,370,362.50 ns 1.000 29,656 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe [a-q][^u-z]{13}x None 78,359.01 ns 0.002 29,537 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe [a-q][^u-z]{13}x Compiled 6,114,925.23 ns 1.000 29,551 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe [a-q][^u-z]{13}x Compiled 48,905.68 ns 0.008 29,536 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe [a-q][^u-z]{13}x NonBacktracking 1,913,033,821.43 ns 1.000 2,250,206,424 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe [a-q][^u-z]{13}x NonBacktracking 99,301.51 ns 0.000 29,536 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe [a-zA-Z]+ing None 32,224,692.22 ns 1.00 587,512 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe [a-zA-Z]+ing None 28,495,211.11 ns 0.88 587,580 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe [a-zA-Z]+ing Compiled 5,993,759.29 ns 1.00 587,409 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe [a-zA-Z]+ing Compiled 6,027,973.78 ns 1.01 587,409 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe [a-zA-Z]+ing NonBacktracking 6,064,019.70 ns 1.00 587,410 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe [a-zA-Z]+ing NonBacktracking 7,168,776.00 ns 1.18 587,413 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \b\w+n\b None 31,108,293.27 ns 1.00 1,740,218 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \b\w+n\b None 29,636,470.54 ns 0.95 1,740,340 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \b\w+n\b Compiled 12,133,476.19 ns 1.00 1,740,188 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \b\w+n\b Compiled 12,401,181.55 ns 1.02 1,740,188 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \b\w+n\b NonBacktracking 8,312,614.44 ns 1.00 2,133,560 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \b\w+n\b NonBacktracking 9,244,832.19 ns 1.11 2,097,539 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \p{Ll} None 40,255,786.54 ns 1.00 90,060,020 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \p{Ll} None 40,254,686.54 ns 1.00 90,060,020 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \p{Ll} Compiled 29,305,301.48 ns 1.00 90,059,982 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \p{Ll} Compiled 29,034,462.09 ns 0.99 90,059,920 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \p{Ll} NonBacktracking 53,269,781.25 ns 1.00 90,060,020 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \p{Ll} NonBacktracking 56,607,580.00 ns 1.06 90,060,020 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \p{Lu} None 3,570,983.27 ns 1.00 2,949,450 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \p{Lu} None 2,730,198.37 ns 0.76 2,949,448 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \p{Lu} Compiled 1,474,347.32 ns 1.00 2,949,445 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \p{Lu} Compiled 1,494,025.49 ns 1.01 2,949,445 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \p{Lu} NonBacktracking 2,618,204.59 ns 1.00 2,949,448 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \p{Lu} NonBacktracking 3,088,072.68 ns 1.18 2,949,449 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \p{L} None 42,264,292.86 ns 1.00 93,009,460 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \p{L} None 40,989,263.46 ns 0.97 93,009,460 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \p{L} Compiled 29,678,550.83 ns 1.00 93,009,370 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \p{L} Compiled 30,317,169.53 ns 1.02 93,009,370 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \p{L} NonBacktracking 54,779,287.50 ns 1.00 93,009,642 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \p{L} NonBacktracking 55,246,435.42 ns 1.01 93,009,460 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \s[a-zA-Z]{0,12}ing\s None 20,425,308.15 ns 1.00 432,928 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \s[a-zA-Z]{0,12}ing\s None 18,277,753.21 ns 0.90 432,903 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \s[a-zA-Z]{0,12}ing\s Compiled 5,618,254.65 ns 1.00 432,865 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \s[a-zA-Z]{0,12}ing\s Compiled 5,636,516.96 ns 1.00 432,865 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \s[a-zA-Z]{0,12}ing\s NonBacktracking 4,998,205.23 ns 1.00 432,874 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \s[a-zA-Z]{0,12}ing\s NonBacktracking 5,263,322.98 ns 1.05 432,863 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \w+ None 15,244,954.91 ns 1.00 22,716,557 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \w+ None 13,612,713.69 ns 0.89 22,716,572 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \w+ Compiled 9,636,018.72 ns 1.00 22,716,577 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \w+ Compiled 9,346,380.16 ns 0.97 22,716,540 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \w+ NonBacktracking 17,990,034.19 ns 1.00 22,716,592 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \w+ NonBacktracking 18,537,428.33 ns 1.03 22,716,584 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \w+\s+Holmes None 12,565,884.76 ns 1.00 66,400 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \w+\s+Holmes None 10,438,652.50 ns 0.83 66,414 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \w+\s+Holmes Compiled 3,816,505.65 ns 1.00 66,365 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \w+\s+Holmes Compiled 3,843,176.25 ns 1.01 66,365 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \w+\s+Holmes NonBacktracking 4,129,915.63 ns 1.00 66,364 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \w+\s+Holmes NonBacktracking 4,662,944.47 ns 1.13 66,366 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \w+\s+Holmes\s+\w+ None 12,486,528.72 ns 1.00 28,544 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \w+\s+Holmes\s+\w+ None 10,461,789.63 ns 0.84 28,536 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \w+\s+Holmes\s+\w+ Compiled 3,838,074.88 ns 1.00 28,509 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \w+\s+Holmes\s+\w+ Compiled 3,834,882.29 ns 1.00 28,509 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe \w+\s+Holmes\s+\w+ NonBacktracking 4,330,990.46 ns 1.00 28,508 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe \w+\s+Holmes\s+\w+ NonBacktracking 4,552,558.88 ns 1.05 28,509 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe aei None 754,303.87 ns 1.00 -
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe aei None 746,433.99 ns 0.99 -
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe aei Compiled 761,881.39 ns 1.00 -
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe aei Compiled 761,182.91 ns 1.00 -
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe aei NonBacktracking 893,414.74 ns 1.00 -
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe aei NonBacktracking 759,851.72 ns 0.85 -
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe aqj None 757,791.11 ns 1.00 -
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe aqj None 748,552.36 ns 0.99 -
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe aqj Compiled 764,630.14 ns 1.00 -
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe aqj Compiled 770,378.82 ns 1.01 -
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe aqj NonBacktracking 738,393.92 ns 1.00 -
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe aqj NonBacktracking 759,543.77 ns 1.03 -
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe the None 1,605,080.76 ns 1.00 1,501,349 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe the None 1,596,498.16 ns 0.99 1,501,349 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe the Compiled 1,398,260.04 ns 1.00 1,501,348 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe the Compiled 1,383,918.27 ns 0.99 1,501,348 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe the NonBacktracking 1,768,233.07 ns 1.00 1,501,349 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe the NonBacktracking 1,694,861.94 ns 0.96 1,501,349 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe the\s+\w+ None 1,964,638.76 ns 1.00 1,125,286 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe the\s+\w+ None 1,830,673.79 ns 0.93 1,125,290 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe the\s+\w+ Compiled 1,405,604.69 ns 1.00 1,125,284 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe the\s+\w+ Compiled 1,408,113.64 ns 1.00 1,125,285 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe the\s+\w+ NonBacktracking 2,533,461.30 ns 1.00 1,125,287 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe the\s+\w+ NonBacktracking 2,440,085.66 ns 0.96 1,125,287 B
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe zqj None 25,450.52 ns 1.00 -
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe zqj None 24,698.79 ns 0.95 -
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe zqj Compiled 24,252.99 ns 1.00 -
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe zqj Compiled 24,192.44 ns 1.00 -
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe zqj NonBacktracking 707,197.50 ns 1.00 -
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe zqj NonBacktracking 24,004.56 ns 0.03 -
Perf_Regex_Industry_Leipzig Count \main\corerun.exe (?i)Tom Sawyer Huckleberry Finn None
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe (?i)Tom Sawyer Huckleberry Finn None
Perf_Regex_Industry_Leipzig Count \main\corerun.exe (?i)Tom Sawyer Huckleberry Finn Compiled
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe (?i)Tom Sawyer Huckleberry Finn Compiled
Perf_Regex_Industry_Leipzig Count \main\corerun.exe (?i)Tom Sawyer Huckleberry Finn NonBacktracking
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe (?i)Tom Sawyer Huckleberry Finn NonBacktracking
Perf_Regex_Industry_Leipzig Count \main\corerun.exe (?i)Twain None 23,718,807.94 ns 1.00 200,881 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe (?i)Twain None 8,548,322.19 ns 0.36 200,746 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe (?i)Twain Compiled 25,416,325.93 ns 1.00 200,881 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe (?i)Twain Compiled 5,515,463.84 ns 0.22 200,737 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe (?i)Twain NonBacktracking 23,329,646.15 ns 1.00 200,800 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe (?i)Twain NonBacktracking 8,367,159.76 ns 0.36 200,772 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe ([A-Za-z]awyer [A-Za-z]inn)\s None 1,137,671,226.67 ns 1.00
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe ([A-Za-z]awyer [A-Za-z]inn)\s None 902,357,906.67 ns 0.79
Perf_Regex_Industry_Leipzig Count \main\corerun.exe ([A-Za-z]awyer [A-Za-z]inn)\s Compiled 66,055,883.33 ns 1.00
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe ([A-Za-z]awyer [A-Za-z]inn)\s Compiled 13,052,931.58 ns 0.20
Perf_Regex_Industry_Leipzig Count \main\corerun.exe ([A-Za-z]awyer [A-Za-z]inn)\s NonBacktracking 147,017,061.54 ns 1.00
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe ([A-Za-z]awyer [A-Za-z]inn)\s NonBacktracking 20,017,116.03 ns 0.14
Perf_Regex_Industry_Leipzig Count \main\corerun.exe .{0,2}(Tom Sawyer Huckleberry Finn) None
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe .{0,2}(Tom Sawyer Huckleberry Finn) None
Perf_Regex_Industry_Leipzig Count \main\corerun.exe .{0,2}(Tom Sawyer Huckleberry Finn) Compiled
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe .{0,2}(Tom Sawyer Huckleberry Finn) Compiled
Perf_Regex_Industry_Leipzig Count \main\corerun.exe .{0,2}(Tom Sawyer Huckleberry Finn) NonBacktracking
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe .{0,2}(Tom Sawyer Huckleberry Finn) NonBacktracking
Perf_Regex_Industry_Leipzig Count \main\corerun.exe .{2,4}(Tom Sawyer Huckleberry Finn) None
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe .{2,4}(Tom Sawyer Huckleberry Finn) None
Perf_Regex_Industry_Leipzig Count \main\corerun.exe .{2,4}(Tom Sawyer Huckleberry Finn) Compiled
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe .{2,4}(Tom Sawyer Huckleberry Finn) Compiled
Perf_Regex_Industry_Leipzig Count \main\corerun.exe .{2,4}(Tom Sawyer Huckleberry Finn) NonBacktracking
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe .{2,4}(Tom Sawyer Huckleberry Finn) NonBacktracking
Perf_Regex_Industry_Leipzig Count \main\corerun.exe Huck[a-zA-Z]+ Saw[a-zA-Z]+ None 62,844,185.71 ns 1.00
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe Huck[a-zA-Z]+ Saw[a-zA-Z]+ None 4,903,562.55 ns 0.08
Perf_Regex_Industry_Leipzig Count \main\corerun.exe Huck[a-zA-Z]+ Saw[a-zA-Z]+ Compiled 2,220,262.43 ns 1.00
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe Huck[a-zA-Z]+ Saw[a-zA-Z]+ Compiled 2,203,296.15 ns 0.99
Perf_Regex_Industry_Leipzig Count \main\corerun.exe Huck[a-zA-Z]+ Saw[a-zA-Z]+ NonBacktracking 3,260,074.27 ns 1.00
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe Huck[a-zA-Z]+ Saw[a-zA-Z]+ NonBacktracking 2,751,910.99 ns 0.84
Perf_Regex_Industry_Leipzig Count \main\corerun.exe Tom.{10,25}river river.{10,25}Tom None 96,995,090.62 ns 1.00
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe Tom.{10,25}river river.{10,25}Tom None 49,019,228.57 ns 0.51
Perf_Regex_Industry_Leipzig Count \main\corerun.exe Tom.{10,25}river river.{10,25}Tom Compiled 12,024,382.00 ns 1.00
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe Tom.{10,25}river river.{10,25}Tom Compiled 7,659,925.40 ns 0.64
Perf_Regex_Industry_Leipzig Count \main\corerun.exe Tom.{10,25}river river.{10,25}Tom NonBacktracking 25,348,974.81 ns 1.00
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe Tom.{10,25}river river.{10,25}Tom NonBacktracking 12,004,805.77 ns 0.47
Perf_Regex_Industry_Leipzig Count \main\corerun.exe Tom Sawyer Huckleberry Finn None
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe Tom Sawyer Huckleberry Finn None
Perf_Regex_Industry_Leipzig Count \main\corerun.exe Tom Sawyer Huckleberry Finn Compiled
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe Tom Sawyer Huckleberry Finn Compiled
Perf_Regex_Industry_Leipzig Count \main\corerun.exe Tom Sawyer Huckleberry Finn NonBacktracking
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe Tom Sawyer Huckleberry Finn NonBacktracking
Perf_Regex_Industry_Leipzig Count \main\corerun.exe Twain None 2,496,472.08 ns 1.00 168,695 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe Twain None 2,472,790.84 ns 0.99 168,695 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe Twain Compiled 2,455,009.63 ns 1.00 168,695 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe Twain Compiled 2,462,571.43 ns 1.00 168,695 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe Twain NonBacktracking 16,403,234.87 ns 1.00 168,736 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe Twain NonBacktracking 2,527,594.07 ns 0.15 168,695 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe [a-z]shing None 599,066,058.33 ns 1.00 321,816 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe [a-z]shing None 10,725,073.60 ns 0.02 320,351 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe [a-z]shing Compiled 147,963,307.69 ns 1.00 321,040 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe [a-z]shing Compiled 7,131,160.83 ns 0.05 320,337 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe [a-z]shing NonBacktracking 145,988,333.33 ns 1.00 321,040 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe [a-z]shing NonBacktracking 10,647,451.24 ns 0.07 320,351 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe \p{Sm} None 59,836,651.67 ns 1.00 14,532 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe \p{Sm} None 37,603,825.51 ns 0.63 14,455 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe \p{Sm} Compiled 11,511,310.10 ns 1.00 14,378 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe \p{Sm} Compiled 11,461,300.96 ns 1.00 14,378 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe \p{Sm} NonBacktracking 22,524,769.70 ns 1.00 14,417 B
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe \p{Sm} NonBacktracking 33,702,615.48 ns 1.50 14,455 B
Perf_Regex_Industry_Leipzig Count \main\corerun.exe None 59,780,462.50 ns 1.00
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe None 1,635,881.41 ns 0.03
Perf_Regex_Industry_Leipzig Count \main\corerun.exe Compiled 1,594,729.17 ns 1.00
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe Compiled 1,581,152.46 ns 0.99
Perf_Regex_Industry_Leipzig Count \main\corerun.exe NonBacktracking 1,593,292.99 ns 1.00
Perf_Regex_Industry_Leipzig Count \pr\corerun.exe NonBacktracking 1,588,459.52 ns 1.00
RegexRedux_1 RegexRedux_1 \main\corerun.exe ? None 41,553,682.14 ns 1.00 2,969,988 B
RegexRedux_1 RegexRedux_1 \pr\corerun.exe ? None 37,636,891.67 ns 0.91 2,997,420 B
RegexRedux_5 RegexRedux_5 \main\corerun.exe ? None 28,241,272.14 ns 1.00 2,798,768 B
RegexRedux_5 RegexRedux_5 \pr\corerun.exe ? None 25,294,893.33 ns 0.90 2,796,740 B
RegexRedux_5 RegexRedux_5 \main\corerun.exe ? Compiled 7,643,919.64 ns 1.00 2,799,742 B
RegexRedux_5 RegexRedux_5 \pr\corerun.exe ? Compiled 6,647,241.64 ns 0.87 2,803,373 B
Perf_Regex_Industry_Mariomka Ctor \main\corerun.exe [\w.+-]+@[\w.-]+.[\w.-]+ None 1,802.79 ns 1.00 3,200 B
Perf_Regex_Industry_Mariomka Ctor \pr\corerun.exe [\w.+-]+@[\w.-]+.[\w.-]+ None 1,739.21 ns 0.96 2,776 B
Perf_Regex_Industry_Mariomka Count \main\corerun.exe [\w.+-]+@[\w.-]+.[\w.-]+ None 95,420,267.86 ns 1.00 19,496 B
Perf_Regex_Industry_Mariomka Count \pr\corerun.exe [\w.+-]+@[\w.-]+.[\w.-]+ None 87,752,300.00 ns 0.92 19,316 B
Perf_Regex_Industry_Mariomka Ctor \main\corerun.exe [\w.+-]+@[\w.-]+.[\w.-]+ Compiled 18,857.49 ns 1.00 12,656 B
Perf_Regex_Industry_Mariomka Ctor \pr\corerun.exe [\w.+-]+@[\w.-]+.[\w.-]+ Compiled 18,631.30 ns 0.99 12,184 B
Perf_Regex_Industry_Mariomka Count \main\corerun.exe [\w.+-]+@[\w.-]+.[\w.-]+ Compiled 43,516,983.33 ns 1.00 19,256 B
Perf_Regex_Industry_Mariomka Count \pr\corerun.exe [\w.+-]+@[\w.-]+.[\w.-]+ Compiled 43,390,845.83 ns 1.00 19,256 B
Perf_Regex_Industry_Mariomka Ctor \main\corerun.exe [\w.+-]+@[\w.-]+.[\w.-]+ NonBacktracking 381,762.44 ns 1.00 310,025 B
Perf_Regex_Industry_Mariomka Ctor \pr\corerun.exe [\w.+-]+@[\w.-]+.[\w.-]+ NonBacktracking 378,707.92 ns 0.99 307,937 B
Perf_Regex_Industry_Mariomka Count \main\corerun.exe [\w.+-]+@[\w.-]+.[\w.-]+ NonBacktracking 58,316,891.67 ns 1.00 19,316 B
Perf_Regex_Industry_Mariomka Count \pr\corerun.exe [\w.+-]+@[\w.-]+.[\w.-]+ NonBacktracking 66,558,896.43 ns 1.14 19,316 B
Perf_Regex_Industry_Mariomka Ctor \main\corerun.exe [\w]+://[^/\s(...)?(?:#[^\s]*)? [51] None 3,139.49 ns 1.00 4,848 B
Perf_Regex_Industry_Mariomka Ctor \pr\corerun.exe [\w]+://[^/\s(...)?(?:#[^\s]*)? [51] None 3,039.44 ns 0.97 4,504 B
Perf_Regex_Industry_Mariomka Count \main\corerun.exe [\w]+://[^/\s(...)?(?:#[^\s]*)? [51] None 97,749,153.33 ns 1.00 1,102,968 B
Perf_Regex_Industry_Mariomka Count \pr\corerun.exe [\w]+://[^/\s(...)?(?:#[^\s]*)? [51] None 85,637,781.67 ns 0.88 1,102,788 B
Perf_Regex_Industry_Mariomka Ctor \main\corerun.exe [\w]+://[^/\s(...)?(?:#[^\s]*)? [51] Compiled 38,322.31 ns 1.00 26,617 B
Perf_Regex_Industry_Mariomka Ctor \pr\corerun.exe [\w]+://[^/\s(...)?(?:#[^\s]*)? [51] Compiled 38,197.63 ns 1.00 26,224 B
Perf_Regex_Industry_Mariomka Count \main\corerun.exe [\w]+://[^/\s(...)?(?:#[^\s]*)? [51] Compiled 46,282,289.29 ns 1.00 1,102,788 B
Perf_Regex_Industry_Mariomka Count \pr\corerun.exe [\w]+://[^/\s(...)?(?:#[^\s]*)? [51] Compiled 46,220,502.08 ns 1.00 1,102,788 B
Perf_Regex_Industry_Mariomka Ctor \main\corerun.exe [\w]+://[^/\s(...)?(?:#[^\s]*)? [51] NonBacktracking 405,126.79 ns 1.00 343,774 B
Perf_Regex_Industry_Mariomka Ctor \pr\corerun.exe [\w]+://[^/\s(...)?(?:#[^\s]*)? [51] NonBacktracking 403,840.97 ns 1.00 341,761 B
Perf_Regex_Industry_Mariomka Count \main\corerun.exe [\w]+://[^/\s(...)?(?:#[^\s]*)? [51] NonBacktracking 59,939,631.67 ns 1.00 1,102,788 B
Perf_Regex_Industry_Mariomka Count \pr\corerun.exe [\w]+://[^/\s(...)?(?:#[^\s]*)? [51] NonBacktracking 68,354,913.33 ns 1.14 1,102,788 B
Perf_Regex_Industry_Mariomka Ctor \main\corerun.exe (?:(?:250-5]?[0-9][0-9]) [87] None 6,482.24 ns 1.00 8,080 B
Perf_Regex_Industry_Mariomka Ctor \pr\corerun.exe (?:(?:250-5]?[0-9][0-9]) [87] None 7,115.57 ns 1.10 8,280 B
Perf_Regex_Industry_Mariomka Count \main\corerun.exe (?:(?:250-5]?[0-9][0-9]) [87] None 38,004,650.00 ns 1.00 -
Perf_Regex_Industry_Mariomka Count \pr\corerun.exe (?:(?:250-5]?[0-9][0-9]) [87] None 28,049,133.67 ns 0.74 1,191 B
Perf_Regex_Industry_Mariomka Ctor \main\corerun.exe (?:(?:250-5]?[0-9][0-9]) [87] Compiled 23,165.01 ns 1.00 23,208 B
Perf_Regex_Industry_Mariomka Ctor \pr\corerun.exe (?:(?:250-5]?[0-9][0-9]) [87] Compiled 25,439.48 ns 1.10 25,056 B
Perf_Regex_Industry_Mariomka Count \main\corerun.exe (?:(?:250-5]?[0-9][0-9]) [87] Compiled 6,370,831.99 ns 1.00 1,064 B
Perf_Regex_Industry_Mariomka Count \pr\corerun.exe (?:(?:250-5]?[0-9][0-9]) [87] Compiled 6,350,644.31 ns 1.00 1,064 B
Perf_Regex_Industry_Mariomka Ctor \main\corerun.exe (?:(?:250-5]?[0-9][0-9]) [87] NonBacktracking 87,644.59 ns 1.00 149,648 B
Perf_Regex_Industry_Mariomka Ctor \pr\corerun.exe (?:(?:250-5]?[0-9][0-9]) [87] NonBacktracking 86,663.11 ns 0.99 149,761 B
Perf_Regex_Industry_Mariomka Count \main\corerun.exe (?:(?:250-5]?[0-9][0-9]) [87] NonBacktracking 12,839,413.91 ns 1.00 1,078 B
Perf_Regex_Industry_Mariomka Count \pr\corerun.exe (?:(?:250-5]?[0-9][0-9]) [87] NonBacktracking 20,377,364.29 ns 1.59 1,172 B
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 62.76 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 65.89 ns 1.05 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 40.85 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 40.91 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 60.50 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 87.16 ns 1.44 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 161.46 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 154.61 ns 0.96 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 73.30 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 74.59 ns 1.02 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 687.45 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 795.49 ns 1.16 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 271.85 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 246.07 ns 0.91 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 97.16 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 102.06 ns 1.05 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 178.90 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 215.75 ns 1.21 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 455.16 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 385.55 ns 0.85 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 140.98 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 141.24 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 246.23 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 272.41 ns 1.11 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 378.95 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 308.17 ns 0.81 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 123.57 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 123.34 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 173.93 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 184.33 ns 1.06 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 379.94 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 340.22 ns 0.90 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 125.34 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 125.96 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 193.62 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 212.19 ns 1.10 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 128.85 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 116.89 ns 0.91 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 42.61 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 43.78 ns 1.03 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 128.33 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 135.73 ns 1.06 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 125.60 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 116.10 ns 0.92 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 42.59 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 42.88 ns 1.01 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 105.04 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 111.33 ns 1.06 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 125.07 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 117.37 ns 0.94 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 41.76 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 43.25 ns 1.04 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 111.49 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 127.97 ns 1.15 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 134.56 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 112.85 ns 0.84 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 40.26 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 40.11 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 131.19 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 137.44 ns 1.04 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 135.09 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 116.08 ns 0.86 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 41.20 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 41.21 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 141.80 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 158.57 ns 1.12 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 97.53 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 90.09 ns 0.92 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 38.86 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 38.74 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 85.60 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 89.90 ns 1.05 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 125.16 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 111.89 ns 0.89 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 44.82 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 44.80 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 139.00 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 149.30 ns 1.07 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? None 124.67 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? None 111.90 ns 0.90 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? Compiled 44.98 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? Compiled 44.89 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \main\corerun.exe ? NonBacktracking 138.01 ns 1.00 -
Perf_Regex_Industry_BoostDocs_Simple IsMatch \pr\corerun.exe ? NonBacktracking 150.78 ns 1.09 -
Perf_Regex_Cache IsMatch \main\corerun.exe ? ? 36,280,917.50 ns 1.00 107,200,120 B
Perf_Regex_Cache IsMatch \pr\corerun.exe ? ? 36,889,390.00 ns 1.02 96,000,120 B
Perf_Regex_Cache IsMatch_Multithreading \main\corerun.exe ? ? 12,761,217.00 ns 1.00 107,201,136 B
Perf_Regex_Cache IsMatch_Multithreading \pr\corerun.exe ? ? 13,376,354.51 ns 1.05 96,001,191 B
Perf_Regex_Cache IsMatch \main\corerun.exe ? ? 81,442,280.00 ns 1.00 167,802,952 B
Perf_Regex_Cache IsMatch \pr\corerun.exe ? ? 86,256,273.33 ns 1.06 156,706,832 B
Perf_Regex_Cache IsMatch_Multithreading \main\corerun.exe ? ? 30,305,710.26 ns 1.00 167,729,155 B
Perf_Regex_Cache IsMatch_Multithreading \pr\corerun.exe ? ? 30,574,329.76 ns 1.01 156,658,415 B
Perf_Regex_Cache IsMatch \main\corerun.exe ? ? 69,044,760.00 ns 1.00 87,588,848 B
Perf_Regex_Cache IsMatch \pr\corerun.exe ? ? 70,905,162.50 ns 1.03 81,324,192 B
Perf_Regex_Cache IsMatch_Multithreading \main\corerun.exe ? ? 47,851,511.25 ns 1.00 87,702,890 B
Perf_Regex_Cache IsMatch_Multithreading \pr\corerun.exe ? ? 45,735,085.00 ns 0.96 81,969,042 B
Perf_Regex_Cache IsMatch \main\corerun.exe ? ? 10,561,671.87 ns 1.00 -
Perf_Regex_Cache IsMatch \pr\corerun.exe ? ? 9,933,559.23 ns 0.93 -
Perf_Regex_Cache IsMatch_Multithreading \main\corerun.exe ? ? 3,997,190.25 ns 1.00 61,736 B
Perf_Regex_Cache IsMatch_Multithreading \pr\corerun.exe ? ? 3,979,859.55 ns 1.00 60,089 B
Perf_Regex_Cache IsMatch \main\corerun.exe ? ? 38,446,023.08 ns 1.00 -
Perf_Regex_Cache IsMatch \pr\corerun.exe ? ? 38,502,030.36 ns 1.00 -
Perf_Regex_Cache IsMatch_Multithreading \main\corerun.exe ? ? 35,723,650.00 ns 1.00 61,161,464 B
Perf_Regex_Cache IsMatch_Multithreading \pr\corerun.exe ? ? 35,247,306.48 ns 0.99 68,409,013 B
Perf_Regex_Cache IsMatch \main\corerun.exe ? ? 51,511,911.54 ns 1.00 -
Perf_Regex_Cache IsMatch \pr\corerun.exe ? ? 50,659,253.33 ns 0.98 -
Perf_Regex_Cache IsMatch_Multithreading \main\corerun.exe ? ? 40,094,616.25 ns 1.00 49,705,372 B
Perf_Regex_Cache IsMatch_Multithreading \pr\corerun.exe ? ? 39,284,054.17 ns 0.98 59,197,761 B
Perf_Regex_Common Backtracking \main\corerun.exe ? Compiled 163.01 ns 1.00 248 B
Perf_Regex_Common Backtracking \pr\corerun.exe ? Compiled 162.43 ns 1.00 248 B
Perf_Regex_Common OneNodeBacktracking \main\corerun.exe ? Compiled 832.26 ns 1.00 -
Perf_Regex_Common OneNodeBacktracking \pr\corerun.exe ? Compiled 836.37 ns 1.00 -
Perf_Regex_Common Email_IsMatch \main\corerun.exe ? Compiled 139.34 ns 1.00 -
Perf_Regex_Common Email_IsMatch \pr\corerun.exe ? Compiled 138.68 ns 1.00 -
Perf_Regex_Common Email_IsNotMatch \main\corerun.exe ? Compiled 206.52 ns 1.00 -
Perf_Regex_Common Email_IsNotMatch \pr\corerun.exe ? Compiled 204.28 ns 0.99 -
Perf_Regex_Common Date_IsMatch \main\corerun.exe ? Compiled 63.72 ns 1.00 -
Perf_Regex_Common Date_IsMatch \pr\corerun.exe ? Compiled 63.68 ns 1.00 -
Perf_Regex_Common Date_IsNotMatch \main\corerun.exe ? Compiled 117.46 ns 1.00 -
Perf_Regex_Common Date_IsNotMatch \pr\corerun.exe ? Compiled 117.10 ns 1.00 -
Perf_Regex_Common IP_IsMatch \main\corerun.exe ? Compiled 175.79 ns 1.00 -
Perf_Regex_Common IP_IsMatch \pr\corerun.exe ? Compiled 170.89 ns 0.97 -
Perf_Regex_Common IP_IsNotMatch \main\corerun.exe ? Compiled 172.14 ns 1.00 -
Perf_Regex_Common IP_IsNotMatch \pr\corerun.exe ? Compiled 169.62 ns 0.99 -
Perf_Regex_Common Uri_IsMatch \main\corerun.exe ? Compiled 98.32 ns 1.00 -
Perf_Regex_Common Uri_IsMatch \pr\corerun.exe ? Compiled 97.08 ns 0.99 -
Perf_Regex_Common Uri_IsNotMatch \main\corerun.exe ? Compiled 111.65 ns 1.00 -
Perf_Regex_Common Uri_IsNotMatch \pr\corerun.exe ? Compiled 110.41 ns 0.99 -
Perf_Regex_Common MatchesSet \main\corerun.exe ? Compiled 53,520.11 ns 1.00 6,696 B
Perf_Regex_Common MatchesSet \pr\corerun.exe ? Compiled 47,569.43 ns 0.89 6,696 B
Perf_Regex_Common MatchesBoundary \main\corerun.exe ? Compiled 57,333.98 ns 1.00 6,696 B
Perf_Regex_Common MatchesBoundary \pr\corerun.exe ? Compiled 47,398.43 ns 0.83 6,696 B
Perf_Regex_Common MatchesWord \main\corerun.exe ? Compiled 2,394.39 ns 1.00 1,480 B
Perf_Regex_Common MatchesWord \pr\corerun.exe ? Compiled 2,402.48 ns 1.01 1,480 B
Perf_Regex_Common MatchesWords \main\corerun.exe ? Compiled 6,161.95 ns 1.00 3,504 B
Perf_Regex_Common MatchesWords \pr\corerun.exe ? Compiled 2,368.01 ns 0.38 3,504 B
Perf_Regex_Common MatchWord \main\corerun.exe ? Compiled 182.13 ns 1.00 208 B
Perf_Regex_Common MatchWord \pr\corerun.exe ? Compiled 111.33 ns 0.61 208 B
Perf_Regex_Common ReplaceWords \main\corerun.exe ? Compiled 6,139.28 ns 1.00 6,848 B
Perf_Regex_Common ReplaceWords \pr\corerun.exe ? Compiled 2,302.15 ns 0.38 6,848 B
Perf_Regex_Common SplitWords \main\corerun.exe ? Compiled 6,014.93 ns 1.00 7,432 B
Perf_Regex_Common SplitWords \pr\corerun.exe ? Compiled 2,177.28 ns 0.36 7,432 B
Perf_Regex_Common Ctor \main\corerun.exe ? Compiled 24,304.05 ns 1.00 27,704 B
Perf_Regex_Common Ctor \pr\corerun.exe ? Compiled 22,017.27 ns 0.91 26,192 B
Perf_Regex_Common CtorInvoke \main\corerun.exe ? Compiled 117,871.80 ns 1.00 30,678 B
Perf_Regex_Common CtorInvoke \pr\corerun.exe ? Compiled 106,120.75 ns 0.90 29,068 B
Perf_Regex_Common Backtracking \main\corerun.exe ? IgnoreCase, Compiled 338.38 ns 1.00 248 B
Perf_Regex_Common Backtracking \pr\corerun.exe ? IgnoreCase, Compiled 182.80 ns 0.54 248 B
Perf_Regex_Common OneNodeBacktracking \main\corerun.exe ? IgnoreCase, Compiled 1,572.31 ns 1.00 -
Perf_Regex_Common OneNodeBacktracking \pr\corerun.exe ? IgnoreCase, Compiled 1,609.75 ns 1.02 -
Perf_Regex_Common Email_IsMatch \main\corerun.exe ? IgnoreCase, Compiled 205.08 ns 1.00 -
Perf_Regex_Common Email_IsMatch \pr\corerun.exe ? IgnoreCase, Compiled 204.21 ns 0.99 -
Perf_Regex_Common Email_IsNotMatch \main\corerun.exe ? IgnoreCase, Compiled 284.11 ns 1.00 -
Perf_Regex_Common Email_IsNotMatch \pr\corerun.exe ? IgnoreCase, Compiled 465.74 ns 1.64 -
Perf_Regex_Common Date_IsMatch \main\corerun.exe ? IgnoreCase, Compiled 77.45 ns 1.00 -
Perf_Regex_Common Date_IsMatch \pr\corerun.exe ? IgnoreCase, Compiled 72.86 ns 0.94 -
Perf_Regex_Common Date_IsNotMatch \main\corerun.exe ? IgnoreCase, Compiled 179.35 ns 1.00 -
Perf_Regex_Common Date_IsNotMatch \pr\corerun.exe ? IgnoreCase, Compiled 155.91 ns 0.87 -
Perf_Regex_Common IP_IsMatch \main\corerun.exe ? IgnoreCase, Compiled 288.47 ns 1.00 -
Perf_Regex_Common IP_IsMatch \pr\corerun.exe ? IgnoreCase, Compiled 174.70 ns 0.60 -
Perf_Regex_Common IP_IsNotMatch \main\corerun.exe ? IgnoreCase, Compiled 274.28 ns 1.00 -
Perf_Regex_Common IP_IsNotMatch \pr\corerun.exe ? IgnoreCase, Compiled 175.90 ns 0.64 -
Perf_Regex_Common Uri_IsMatch \main\corerun.exe ? IgnoreCase, Compiled 143.39 ns 1.00 -
Perf_Regex_Common Uri_IsMatch \pr\corerun.exe ? IgnoreCase, Compiled 142.52 ns 0.99 -
Perf_Regex_Common Uri_IsNotMatch \main\corerun.exe ? IgnoreCase, Compiled 190.72 ns 1.00 -
Perf_Regex_Common Uri_IsNotMatch \pr\corerun.exe ? IgnoreCase, Compiled 337.76 ns 1.77 -
Perf_Regex_Common MatchesSet \main\corerun.exe ? IgnoreCase, Compiled 102,966.36 ns 1.00 6,696 B
Perf_Regex_Common MatchesSet \pr\corerun.exe ? IgnoreCase, Compiled 57,836.41 ns 0.56 6,696 B
Perf_Regex_Common MatchesBoundary \main\corerun.exe ? IgnoreCase, Compiled 99,719.82 ns 1.00 6,696 B
Perf_Regex_Common MatchesBoundary \pr\corerun.exe ? IgnoreCase, Compiled 58,803.43 ns 0.59 6,696 B
Perf_Regex_Common MatchesWord \main\corerun.exe ? IgnoreCase, Compiled 3,296.76 ns 1.00 1,480 B
Perf_Regex_Common MatchesWord \pr\corerun.exe ? IgnoreCase, Compiled 1,483.23 ns 0.45 1,480 B
Perf_Regex_Common MatchesWords \main\corerun.exe ? IgnoreCase, Compiled 17,183.53 ns 1.00 3,504 B
Perf_Regex_Common MatchesWords \pr\corerun.exe ? IgnoreCase, Compiled 3,085.54 ns 0.18 3,504 B
Perf_Regex_Common MatchWord \main\corerun.exe ? IgnoreCase, Compiled 408.74 ns 1.00 208 B
Perf_Regex_Common MatchWord \pr\corerun.exe ? IgnoreCase, Compiled 142.45 ns 0.35 208 B
Perf_Regex_Common ReplaceWords \main\corerun.exe ? IgnoreCase, Compiled 14,457.45 ns 1.00 6,848 B
Perf_Regex_Common ReplaceWords \pr\corerun.exe ? IgnoreCase, Compiled 3,074.16 ns 0.21 6,848 B
Perf_Regex_Common SplitWords \main\corerun.exe ? IgnoreCase, Compiled 14,659.64 ns 1.00 7,432 B
Perf_Regex_Common SplitWords \pr\corerun.exe ? IgnoreCase, Compiled 2,864.13 ns 0.20 7,432 B
Perf_Regex_Common Ctor \main\corerun.exe ? IgnoreCase, Compiled 30,940.34 ns 1.00 29,968 B
Perf_Regex_Common Ctor \pr\corerun.exe ? IgnoreCase, Compiled 30,597.55 ns 0.99 30,688 B
Perf_Regex_Common CtorInvoke \main\corerun.exe ? IgnoreCase, Compiled 168,305.30 ns 1.00 33,310 B
Perf_Regex_Common CtorInvoke \pr\corerun.exe ? IgnoreCase, Compiled 123,219.24 ns 0.73 34,008 B
Perf_Regex_Common Backtracking \main\corerun.exe ? None 1,456.25 ns 1.00 248 B
Perf_Regex_Common Backtracking \pr\corerun.exe ? None 1,426.05 ns 0.98 248 B
Perf_Regex_Common OneNodeBacktracking \main\corerun.exe ? None 5,649.41 ns 1.00 -
Perf_Regex_Common OneNodeBacktracking \pr\corerun.exe ? None 5,528.62 ns 0.98 -
Perf_Regex_Common Email_IsMatch \main\corerun.exe ? None 447.34 ns 1.00 -
Perf_Regex_Common Email_IsMatch \pr\corerun.exe ? None 363.43 ns 0.81 -
Perf_Regex_Common Email_IsNotMatch \main\corerun.exe ? None 731.32 ns 1.00 -
Perf_Regex_Common Email_IsNotMatch \pr\corerun.exe ? None 683.95 ns 0.94 -
Perf_Regex_Common Date_IsMatch \main\corerun.exe ? None 179.07 ns 1.00 -
Perf_Regex_Common Date_IsMatch \pr\corerun.exe ? None 157.20 ns 0.88 -
Perf_Regex_Common Date_IsNotMatch \main\corerun.exe ? None 408.42 ns 1.00 -
Perf_Regex_Common Date_IsNotMatch \pr\corerun.exe ? None 352.61 ns 0.86 -
Perf_Regex_Common IP_IsMatch \main\corerun.exe ? None 635.05 ns 1.00 -
Perf_Regex_Common IP_IsMatch \pr\corerun.exe ? None 587.15 ns 0.92 -
Perf_Regex_Common IP_IsNotMatch \main\corerun.exe ? None 637.63 ns 1.00 -
Perf_Regex_Common IP_IsNotMatch \pr\corerun.exe ? None 589.94 ns 0.93 -
Perf_Regex_Common Uri_IsMatch \main\corerun.exe ? None 290.58 ns 1.00 -
Perf_Regex_Common Uri_IsMatch \pr\corerun.exe ? None 252.66 ns 0.87 -
Perf_Regex_Common Uri_IsNotMatch \main\corerun.exe ? None 346.54 ns 1.00 -
Perf_Regex_Common Uri_IsNotMatch \pr\corerun.exe ? None 293.83 ns 0.85 -
Perf_Regex_Common MatchesSet \main\corerun.exe ? None 179,077.37 ns 1.00 6,697 B
Perf_Regex_Common MatchesSet \pr\corerun.exe ? None 132,097.01 ns 0.74 6,696 B
Perf_Regex_Common MatchesBoundary \main\corerun.exe ? None 135,424.94 ns 1.00 6,696 B
Perf_Regex_Common MatchesBoundary \pr\corerun.exe ? None 113,965.33 ns 0.84 6,697 B
Perf_Regex_Common MatchesWord \main\corerun.exe ? None 2,593.70 ns 1.00 1,480 B
Perf_Regex_Common MatchesWord \pr\corerun.exe ? None 2,590.69 ns 1.00 1,480 B
Perf_Regex_Common MatchesWords \main\corerun.exe ? None 65,701.25 ns 1.00 3,504 B
Perf_Regex_Common MatchesWords \pr\corerun.exe ? None 51,628.86 ns 0.78 3,504 B
Perf_Regex_Common MatchWord \main\corerun.exe ? None 1,680.69 ns 1.00 208 B
Perf_Regex_Common MatchWord \pr\corerun.exe ? None 1,369.82 ns 0.82 208 B
Perf_Regex_Common ReplaceWords \main\corerun.exe ? None 65,371.10 ns 1.00 6,849 B
Perf_Regex_Common ReplaceWords \pr\corerun.exe ? None 53,501.68 ns 0.81 6,848 B
Perf_Regex_Common SplitWords \main\corerun.exe ? None 66,615.21 ns 1.00 7,433 B
Perf_Regex_Common SplitWords \pr\corerun.exe ? None 50,404.24 ns 0.76 7,432 B
Perf_Regex_Common Ctor \main\corerun.exe ? None 5,296.62 ns 1.00 7,552 B
Perf_Regex_Common Ctor \pr\corerun.exe ? None 4,813.12 ns 0.91 6,744 B
Perf_Regex_Common CtorInvoke \main\corerun.exe ? None 5,270.26 ns 1.00 7,696 B
Perf_Regex_Common CtorInvoke \pr\corerun.exe ? None 4,784.73 ns 0.91 6,880 B
Author: stephentoub
Assignees: -
Labels:

area-System.Text.RegularExpressions

Milestone: 7.0.0

@stephentoub
Copy link
Member Author

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

Also, this specific improvement stands out:

Type Method Toolchain Pattern Options Mean Ratio Allocated
Perf_Regex_Industry_RustLang_Sherlock Count \main\corerun.exe [a-q][^u-z]{13}x NonBacktracking 1,913,033,821.43 ns 1.000 2,250,206,424 B
Perf_Regex_Industry_RustLang_Sherlock Count \pr\corerun.exe [a-q][^u-z]{13}x NonBacktracking 99,301.51 ns 0.000 29,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
Member Author

cc: @danmoseley

@danmoseley
Copy link
Member

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
Member Author

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.

else if (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
Member

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
Member

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

@stephentoub
Copy link
Member Author

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
Member

@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
Member Author

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
Member Author

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
Member

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

@stephentoub stephentoub force-pushed the factoroutffc4 branch 2 times, most recently from dbdf454 to 2936610 Compare November 15, 2021 21:10
@stephentoub
Copy link
Member Author

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

…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.
@stephentoub
Copy link
Member Author

@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
Member

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

Copy link
Member

@joperezr joperezr left a comment

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
Member Author

Excellent. Thanks, Jose.

@DrewScoggins
Copy link
Member

Improvements: dotnet/perf-autofiling-issues#2424

@EgorBo
Copy link
Member

EgorBo commented Dec 2, 2021

@ghost ghost locked as resolved and limited conversation to collaborators Jan 1, 2022
Sign up for free to 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