Skip to content

Commit

Permalink
perf(es/lexer): Use memchr::memmem for lexing block comments (#9096)
Browse files Browse the repository at this point in the history
**Description:**

This PR also makes the lexer more CPU-cache friendly.
  • Loading branch information
kdy1 committed Jun 22, 2024
1 parent a19a287 commit 1b3672f
Show file tree
Hide file tree
Showing 6 changed files with 79 additions and 74 deletions.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions crates/swc_ecma_parser/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ verify = ["swc_ecma_visit"]

[dependencies]
either = { workspace = true }
memchr = { workspace = true, features = ["use_std"] }
num-bigint = { workspace = true }
num-traits = { workspace = true }
serde = { workspace = true, features = ["derive"] }
Expand Down
2 changes: 1 addition & 1 deletion crates/swc_ecma_parser/src/lexer/jsx.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ impl<'a> Lexer<'a> {

self.emit_error_span(span, SyntaxError::TS1185);
self.skip_line_comment(6);
self.skip_space::<true>()?;
self.skip_space::<true>();
return self.read_token();
}
'<' | '{' => {
Expand Down
10 changes: 5 additions & 5 deletions crates/swc_ecma_parser/src/lexer/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -379,7 +379,7 @@ impl<'a> Lexer<'a> {
let span = fixed_len_span(start, 7);
self.emit_error_span(span, SyntaxError::TS1185);
self.skip_line_comment(5);
self.skip_space::<true>()?;
self.skip_space::<true>();
return self.error_span(span, SyntaxError::TS1185);
}

Expand Down Expand Up @@ -572,7 +572,7 @@ impl<'a> Lexer<'a> {
if self.state.had_line_break && c == b'-' && self.eat(b'>') {
self.emit_module_mode_error(start, SyntaxError::LegacyCommentInModule);
self.skip_line_comment(0);
self.skip_space::<true>()?;
self.skip_space::<true>();
return self.read_token();
}

Expand Down Expand Up @@ -617,7 +617,7 @@ impl<'a> Lexer<'a> {
if had_line_break_before_last && self.is_str("====") {
self.emit_error_span(fixed_len_span(start, 7), SyntaxError::TS1185);
self.skip_line_comment(4);
self.skip_space::<true>()?;
self.skip_space::<true>();
return self.read_token();
}

Expand Down Expand Up @@ -676,7 +676,7 @@ impl<'a> Lexer<'a> {
// XML style comment. `<!--`
if c == '<' && self.is(b'!') && self.peek() == Some('-') && self.peek_ahead() == Some('-') {
self.skip_line_comment(3);
self.skip_space::<true>()?;
self.skip_space::<true>();
self.emit_module_mode_error(start, SyntaxError::LegacyCommentInModule);

return self.read_token();
Expand Down Expand Up @@ -732,7 +732,7 @@ impl<'a> Lexer<'a> {
{
self.emit_error_span(fixed_len_span(start, 7), SyntaxError::TS1185);
self.skip_line_comment(5);
self.skip_space::<true>()?;
self.skip_space::<true>();
return self.read_token();
}

Expand Down
85 changes: 47 additions & 38 deletions crates/swc_ecma_parser/src/lexer/state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,50 @@ impl Tokens for Lexer<'_> {
}

impl Lexer<'_> {
/// Consume pending comments.
///
/// This is called when the input is exhausted.
#[cold]
#[inline(never)]
fn consume_pending_comments(&mut self) {
if let Some(comments) = self.comments.as_mut() {
let comments_buffer = self.comments_buffer.as_mut().unwrap();
let last = self.state.prev_hi;

// move the pending to the leading or trailing
for c in comments_buffer.take_pending_leading() {
// if the file had no tokens and no shebang, then treat any
// comments in the leading comments buffer as leading.
// Otherwise treat them as trailing.
if last == self.start_pos {
comments_buffer.push(BufferedComment {
kind: BufferedCommentKind::Leading,
pos: last,
comment: c,
});
} else {
comments_buffer.push(BufferedComment {
kind: BufferedCommentKind::Trailing,
pos: last,
comment: c,
});
}
}

// now fill the user's passed in comments
for comment in comments_buffer.take_comments() {
match comment.kind {
BufferedCommentKind::Leading => {
comments.add_leading(comment.pos, comment.comment);
}
BufferedCommentKind::Trailing => {
comments.add_trailing(comment.pos, comment.comment);
}
}
}
}
}

fn next_token(&mut self, start: &mut BytePos) -> Result<Option<Token>, Error> {
if let Some(start) = self.state.next_regexp {
return Ok(Some(self.read_regexp(start)?));
Expand All @@ -210,50 +254,15 @@ impl Lexer<'_> {

// skip spaces before getting next character, if we are allowed to.
if self.state.can_skip_space() {
self.skip_space::<true>()?;
self.skip_space::<true>();
*start = self.input.cur_pos();
};

match self.input.cur() {
Some(..) => {}
// End of input.
None => {
if let Some(comments) = self.comments.as_mut() {
let comments_buffer = self.comments_buffer.as_mut().unwrap();
let last = self.state.prev_hi;

// move the pending to the leading or trailing
for c in comments_buffer.take_pending_leading() {
// if the file had no tokens and no shebang, then treat any
// comments in the leading comments buffer as leading.
// Otherwise treat them as trailing.
if last == self.start_pos {
comments_buffer.push(BufferedComment {
kind: BufferedCommentKind::Leading,
pos: last,
comment: c,
});
} else {
comments_buffer.push(BufferedComment {
kind: BufferedCommentKind::Trailing,
pos: last,
comment: c,
});
}
}

// now fill the user's passed in comments
for comment in comments_buffer.take_comments() {
match comment.kind {
BufferedCommentKind::Leading => {
comments.add_leading(comment.pos, comment.comment);
}
BufferedCommentKind::Trailing => {
comments.add_trailing(comment.pos, comment.comment);
}
}
}
}
self.consume_pending_comments();

return Ok(None);
}
Expand Down Expand Up @@ -311,7 +320,7 @@ impl Lexer<'_> {

self.emit_error_span(span, SyntaxError::TS1185);
self.skip_line_comment(6);
self.skip_space::<true>()?;
self.skip_space::<true>();
return self.read_token();
}

Expand Down
54 changes: 24 additions & 30 deletions crates/swc_ecma_parser/src/lexer/util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
//! [babylon/util/identifier.js]:https://github.com/babel/babel/blob/master/packages/babylon/src/util/identifier.js
use std::char;

use ::memchr::memmem;
use swc_common::{
comments::{Comment, CommentKind},
BytePos, Span, SyntaxContext,
Expand Down Expand Up @@ -160,7 +161,7 @@ impl<'a> Lexer<'a> {
///
/// See https://tc39.github.io/ecma262/#sec-white-space
#[inline(never)]
pub(super) fn skip_space<const LEX_COMMENTS: bool>(&mut self) -> LexResult<()> {
pub(super) fn skip_space<const LEX_COMMENTS: bool>(&mut self) {
loop {
let (offset, newline) = {
let mut skip = SkipWhitespace {
Expand All @@ -182,15 +183,13 @@ impl<'a> Lexer<'a> {
self.skip_line_comment(2);
continue;
} else if self.peek() == Some('*') {
self.skip_block_comment()?;
self.skip_block_comment();
continue;
}
}

break;
}

Ok(())
}

#[inline(never)]
Expand Down Expand Up @@ -250,7 +249,7 @@ impl<'a> Lexer<'a> {

/// Expects current char to be '/' and next char to be '*'.
#[inline(never)]
pub(super) fn skip_block_comment(&mut self) -> LexResult<()> {
pub(super) fn skip_block_comment(&mut self) {
let start = self.cur_pos();

debug_assert_eq!(self.cur(), Some('/'));
Expand All @@ -260,41 +259,36 @@ impl<'a> Lexer<'a> {

// jsdoc
let slice_start = self.cur_pos();
let mut was_star = if self.input.is_byte(b'*') {
self.bump();
true
} else {
false
};

let mut is_for_next = self.state.had_line_break || !self.state.can_have_trailing_comment();

while let Some(c) = self.cur() {
if was_star && c == '/' {
debug_assert_eq!(self.cur(), Some('/'));
self.bump(); // '/'

let end = self.cur_pos();

self.skip_space::<false>()?;
if let Some(idx) = memmem::find(self.input.as_str().as_bytes(), b"*/") {
if !self.state.had_line_break {
self.state.had_line_break = self.input.as_str()[0..idx]
.chars()
.any(|c| c.is_line_terminator());
}

if self.input.is_byte(b';') {
is_for_next = false;
}
self.input.bump_bytes(idx + 2);
let end = self.cur_pos();

self.store_comment(is_for_next, start, end, slice_start);
self.skip_space::<false>();

return Ok(());
}
if c.is_line_terminator() {
self.state.had_line_break = true;
if self.input.is_byte(b';') {
is_for_next = false;
}

was_star = c == '*';
self.bump();
self.store_comment(is_for_next, start, end, slice_start);

return;
}

self.error(start, SyntaxError::UnterminatedBlockComment)?
let len = self.input.as_str().bytes().len();
self.input.bump_bytes(len);

let span = self.span(start);

self.emit_error_span(span, SyntaxError::UnterminatedBlockComment)
}

#[inline(never)]
Expand Down

1 comment on commit 1b3672f

@github-actions
Copy link

Choose a reason for hiding this comment

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

Benchmark

Benchmark suite Current: 1b3672f Previous: e71b6d3 Ratio
es/full/bugs-1 278677 ns/iter (± 13590) 280128 ns/iter (± 11312) 0.99
es/full/minify/libraries/antd 1820184794 ns/iter (± 101589570) 1814605979 ns/iter (± 91259401) 1.00
es/full/minify/libraries/d3 341174245 ns/iter (± 4180993) 356978574 ns/iter (± 5390144) 0.96
es/full/minify/libraries/echarts 1491089227 ns/iter (± 51276298) 1621180355 ns/iter (± 34712322) 0.92
es/full/minify/libraries/jquery 102531130 ns/iter (± 251151) 104958804 ns/iter (± 687791) 0.98
es/full/minify/libraries/lodash 113094380 ns/iter (± 724134) 115575586 ns/iter (± 1120053) 0.98
es/full/minify/libraries/moment 59688003 ns/iter (± 152755) 60142456 ns/iter (± 772938) 0.99
es/full/minify/libraries/react 18324318 ns/iter (± 16893) 18557644 ns/iter (± 628806) 0.99
es/full/minify/libraries/terser 274302227 ns/iter (± 1067183) 288157598 ns/iter (± 7362672) 0.95
es/full/minify/libraries/three 468823073 ns/iter (± 3561188) 562632840 ns/iter (± 13391285) 0.83
es/full/minify/libraries/typescript 3231052554 ns/iter (± 39287864) 3452066840 ns/iter (± 101954286) 0.94
es/full/minify/libraries/victory 725832463 ns/iter (± 7605929) 948083999 ns/iter (± 67850762) 0.77
es/full/minify/libraries/vue 145543264 ns/iter (± 892376) 152253009 ns/iter (± 1746183) 0.96
es/full/codegen/es3 60499 ns/iter (± 748) 59214 ns/iter (± 468) 1.02
es/full/codegen/es5 60289 ns/iter (± 199) 59041 ns/iter (± 191) 1.02
es/full/codegen/es2015 60034 ns/iter (± 244) 58683 ns/iter (± 358) 1.02
es/full/codegen/es2016 60068 ns/iter (± 171) 58583 ns/iter (± 328) 1.03
es/full/codegen/es2017 60094 ns/iter (± 200) 58501 ns/iter (± 345) 1.03
es/full/codegen/es2018 59974 ns/iter (± 724) 58790 ns/iter (± 339) 1.02
es/full/codegen/es2019 60046 ns/iter (± 246) 58943 ns/iter (± 504) 1.02
es/full/codegen/es2020 60391 ns/iter (± 559) 59525 ns/iter (± 298) 1.01
es/full/all/es3 159506952 ns/iter (± 1362440) 161217561 ns/iter (± 1188802) 0.99
es/full/all/es5 153217511 ns/iter (± 1075266) 155956771 ns/iter (± 625402) 0.98
es/full/all/es2015 113621532 ns/iter (± 465503) 115404889 ns/iter (± 1421571) 0.98
es/full/all/es2016 113283861 ns/iter (± 1121094) 114565701 ns/iter (± 879051) 0.99
es/full/all/es2017 111982898 ns/iter (± 802830) 113843984 ns/iter (± 846711) 0.98
es/full/all/es2018 110568198 ns/iter (± 1278361) 112483797 ns/iter (± 383430) 0.98
es/full/all/es2019 109491676 ns/iter (± 705503) 111920543 ns/iter (± 1379397) 0.98
es/full/all/es2020 105309878 ns/iter (± 594037) 107585315 ns/iter (± 856909) 0.98
es/full/parser 434629 ns/iter (± 2051) 456634 ns/iter (± 4945) 0.95
es/full/base/fixer 15477 ns/iter (± 88) 15607 ns/iter (± 175) 0.99
es/full/base/resolver_and_hygiene 80850 ns/iter (± 226) 80867 ns/iter (± 199) 1.00
serialization of serde 270 ns/iter (± 3) 253 ns/iter (± 14) 1.07
css/minify/libraries/bootstrap 22714148 ns/iter (± 333469) 22484391 ns/iter (± 24441) 1.01
css/visitor/compare/clone 1390265 ns/iter (± 13588) 1385986 ns/iter (± 7719) 1.00
css/visitor/compare/visit_mut_span 1499558 ns/iter (± 13116) 1523383 ns/iter (± 5463) 0.98
css/visitor/compare/visit_mut_span_panic 1503150 ns/iter (± 29656) 1519056 ns/iter (± 49528) 0.99
css/visitor/compare/fold_span 2008399 ns/iter (± 4296) 2013294 ns/iter (± 10270) 1.00
css/visitor/compare/fold_span_panic 2151870 ns/iter (± 10233) 2143962 ns/iter (± 8486) 1.00
css/lexer/bootstrap_5_1_3 3452695 ns/iter (± 3171) 3417361 ns/iter (± 17814) 1.01
css/lexer/foundation_6_7_4 2806728 ns/iter (± 1690) 2784920 ns/iter (± 5235) 1.01
css/lexer/tailwind_3_1_1 539871 ns/iter (± 526) 534914 ns/iter (± 456) 1.01
css/parser/bootstrap_5_1_3 15889291 ns/iter (± 25939) 16050841 ns/iter (± 44592) 0.99
css/parser/foundation_6_7_4 12755541 ns/iter (± 22364) 12929625 ns/iter (± 71231) 0.99
css/parser/tailwind_3_1_1 2503287 ns/iter (± 2436) 2530535 ns/iter (± 12199) 0.99
es/codegen/colors 724910 ns/iter (± 395452) 719597 ns/iter (± 393002) 1.01
es/codegen/large 3008258 ns/iter (± 1575014) 2998485 ns/iter (± 1589675) 1.00
es/codegen/with-parser/colors 41292 ns/iter (± 481) 40928 ns/iter (± 325) 1.01
es/codegen/with-parser/large 456468 ns/iter (± 7632) 446289 ns/iter (± 1689) 1.02
es/minify/libraries/antd 1417463953 ns/iter (± 18521530) 1587222150 ns/iter (± 28547102) 0.89
es/minify/libraries/d3 279656781 ns/iter (± 3556801) 313521662 ns/iter (± 13624773) 0.89
es/minify/libraries/echarts 1155178171 ns/iter (± 14053928) 1307224586 ns/iter (± 11015485) 0.88
es/minify/libraries/jquery 81986005 ns/iter (± 586493) 84000654 ns/iter (± 542522) 0.98
es/minify/libraries/lodash 104052089 ns/iter (± 572945) 106180351 ns/iter (± 572025) 0.98
es/minify/libraries/moment 48088952 ns/iter (± 140788) 48737943 ns/iter (± 138540) 0.99
es/minify/libraries/react 16251610 ns/iter (± 34046) 16270350 ns/iter (± 37891) 1.00
es/minify/libraries/terser 219285187 ns/iter (± 1020236) 228630901 ns/iter (± 4013670) 0.96
es/minify/libraries/three 364693951 ns/iter (± 6140104) 416203469 ns/iter (± 8111425) 0.88
es/minify/libraries/typescript 2719288092 ns/iter (± 21004237) 2836908740 ns/iter (± 30077103) 0.96
es/minify/libraries/victory 564903250 ns/iter (± 7272229) 721691731 ns/iter (± 11374711) 0.78
es/minify/libraries/vue 120948594 ns/iter (± 560143) 125155645 ns/iter (± 1364135) 0.97
es/visitor/compare/clone 1750259 ns/iter (± 28917) 1738382 ns/iter (± 5624) 1.01
es/visitor/compare/visit_mut_span 2115387 ns/iter (± 13565) 2091807 ns/iter (± 13332) 1.01
es/visitor/compare/visit_mut_span_panic 2073535 ns/iter (± 49256) 2106764 ns/iter (± 51276) 0.98
es/visitor/compare/fold_span 2790460 ns/iter (± 7141) 2823525 ns/iter (± 5562) 0.99
es/visitor/compare/fold_span_panic 2853219 ns/iter (± 28885) 2825188 ns/iter (± 3424) 1.01
es/lexer/colors 8373 ns/iter (± 14) 9384 ns/iter (± 60) 0.89
es/lexer/angular 4158709 ns/iter (± 12180) 4782205 ns/iter (± 15025) 0.87
es/lexer/backbone 616266 ns/iter (± 2836) 625010 ns/iter (± 1126) 0.99
es/lexer/jquery 3455426 ns/iter (± 6645) 3494356 ns/iter (± 1578) 0.99
es/lexer/jquery mobile 5309512 ns/iter (± 24826) 5222975 ns/iter (± 91661) 1.02
es/lexer/mootools 2782634 ns/iter (± 7003) 2770033 ns/iter (± 3254) 1.00
es/lexer/underscore 520133 ns/iter (± 4675) 523583 ns/iter (± 1414) 0.99
es/lexer/three 15779409 ns/iter (± 35796) 15592132 ns/iter (± 24383) 1.01
es/lexer/yui 2705292 ns/iter (± 11803) 2883268 ns/iter (± 14659) 0.94
es/lexer/cal-com 12820957 ns/iter (± 20429) 12936074 ns/iter (± 65786) 0.99
es/lexer/typescript 90549878 ns/iter (± 906145) 89088456 ns/iter (± 597979) 1.02
es/parser/colors 23787 ns/iter (± 93) 24480 ns/iter (± 191) 0.97
es/parser/angular 12072369 ns/iter (± 171964) 12597855 ns/iter (± 77634) 0.96
es/parser/backbone 1852487 ns/iter (± 8040) 1844179 ns/iter (± 11801) 1.00
es/parser/jquery 10207941 ns/iter (± 85642) 10123807 ns/iter (± 137773) 1.01
es/parser/jquery mobile 15472637 ns/iter (± 154475) 15286534 ns/iter (± 204237) 1.01
es/parser/mootools 7932710 ns/iter (± 47477) 7901402 ns/iter (± 23680) 1.00
es/parser/underscore 1615191 ns/iter (± 7755) 1605341 ns/iter (± 7807) 1.01
es/parser/three 45493586 ns/iter (± 1014616) 44337019 ns/iter (± 363388) 1.03
es/parser/yui 7359760 ns/iter (± 65717) 7506875 ns/iter (± 29955) 0.98
es/parser/cal-com 44795115 ns/iter (± 1334279) 41139392 ns/iter (± 566479) 1.09
es/parser/typescript 282977767 ns/iter (± 3487291) 273433005 ns/iter (± 1159632) 1.03
es/preset-env/usage/builtin_type 135210 ns/iter (± 34165) 137525 ns/iter (± 33401) 0.98
es/preset-env/usage/property 16579 ns/iter (± 64) 16720 ns/iter (± 67) 0.99
es/resolver/typescript 103233328 ns/iter (± 2194552) 102299082 ns/iter (± 2422811) 1.01
es/fixer/typescript 85185104 ns/iter (± 1916305) 83074792 ns/iter (± 2252623) 1.03
es/hygiene/typescript 183731218 ns/iter (± 3436743) 187852266 ns/iter (± 3757205) 0.98
es/resolver_with_hygiene/typescript 317718778 ns/iter (± 2474040) 305400494 ns/iter (± 3136043) 1.04
es/visitor/base-perf/module_clone 55409 ns/iter (± 404) 57196 ns/iter (± 2051) 0.97
es/visitor/base-perf/fold_empty 59705 ns/iter (± 792) 60091 ns/iter (± 284) 0.99
es/visitor/base-perf/fold_noop_impl_all 59144 ns/iter (± 415) 60406 ns/iter (± 781) 0.98
es/visitor/base-perf/fold_noop_impl_vec 59048 ns/iter (± 431) 60565 ns/iter (± 322) 0.97
es/visitor/base-perf/boxing_boxed_clone 60 ns/iter (± 0) 61 ns/iter (± 0) 0.98
es/visitor/base-perf/boxing_unboxed_clone 47 ns/iter (± 0) 48 ns/iter (± 0) 0.98
es/visitor/base-perf/boxing_boxed 115 ns/iter (± 0) 106 ns/iter (± 0) 1.08
es/visitor/base-perf/boxing_unboxed 91 ns/iter (± 1) 80 ns/iter (± 0) 1.14
es/visitor/base-perf/visit_contains_this 2575 ns/iter (± 14) 2632 ns/iter (± 7) 0.98
es/base/parallel/resolver/typescript 2326683336 ns/iter (± 175689592) 2439055544 ns/iter (± 101297118) 0.95
es/base/parallel/hygiene/typescript 3351422847 ns/iter (± 36812784) 3167905463 ns/iter (± 39682484) 1.06
babelify-only 501984 ns/iter (± 5591) 491506 ns/iter (± 6006) 1.02
parse_and_babelify_angular 37933848 ns/iter (± 2268682) 37585933 ns/iter (± 642079) 1.01
parse_and_babelify_backbone 4332144 ns/iter (± 123080) 4368395 ns/iter (± 167897) 0.99
parse_and_babelify_jquery 29308196 ns/iter (± 263922) 28213743 ns/iter (± 243608) 1.04
parse_and_babelify_jquery_mobile 50763698 ns/iter (± 628124) 47806341 ns/iter (± 352167) 1.06
parse_and_babelify_mootools 26215683 ns/iter (± 842818) 25653770 ns/iter (± 360516) 1.02
parse_and_babelify_underscore 3673797 ns/iter (± 15777) 3688556 ns/iter (± 50573) 1.00
parse_and_babelify_yui 27885390 ns/iter (± 1566041) 23187746 ns/iter (± 242594) 1.20
html/minify/document/css_spec 44785507 ns/iter (± 207495) 45585278 ns/iter (± 822413) 0.98
html/minify/document/github 17917511 ns/iter (± 142704) 18039504 ns/iter (± 68072) 0.99
html/minify/document/stackoverflow 16394904 ns/iter (± 37588) 16574552 ns/iter (± 198827) 0.99
html/minify/document_fragment/css_spec 44055978 ns/iter (± 88044) 46377499 ns/iter (± 89836) 0.95
html/minify/document_fragment/github 17728181 ns/iter (± 23240) 18193101 ns/iter (± 37972) 0.97
html/minify/document_fragment/stackoverflow 16329543 ns/iter (± 16385) 16807836 ns/iter (± 59904) 0.97
html/document/visitor/compare/clone 166986 ns/iter (± 2188) 165358 ns/iter (± 1701) 1.01
html/document/visitor/compare/visit_mut_span 182236 ns/iter (± 4364) 183819 ns/iter (± 3131) 0.99
html/document/visitor/compare/visit_mut_span_panic 188345 ns/iter (± 9874) 187502 ns/iter (± 4477) 1.00
html/document/visitor/compare/fold_span 227742 ns/iter (± 1736) 232326 ns/iter (± 1361) 0.98
html/document/visitor/compare/fold_span_panic 280231 ns/iter (± 806) 277525 ns/iter (± 1160) 1.01
html/document_fragment/visitor/compare/clone 165654 ns/iter (± 1238) 167786 ns/iter (± 1740) 0.99
html/document_fragment/visitor/compare/visit_mut_span 182012 ns/iter (± 453) 184275 ns/iter (± 1190) 0.99
html/document_fragment/visitor/compare/visit_mut_span_panic 189414 ns/iter (± 1394) 188111 ns/iter (± 1882) 1.01
html/document_fragment/visitor/compare/fold_span 228495 ns/iter (± 2444) 230997 ns/iter (± 747) 0.99
html/document_fragment/visitor/compare/fold_span_panic 280148 ns/iter (± 1414) 278838 ns/iter (± 1152) 1.00
html/lexer/css_2021_spec 13089179 ns/iter (± 14114) 12987880 ns/iter (± 227254) 1.01
html/lexer/github_com_17_05_2022 5020861 ns/iter (± 7344) 4972229 ns/iter (± 10277) 1.01
html/lexer/stackoverflow_com_17_05_2022 4770467 ns/iter (± 24385) 4742602 ns/iter (± 16796) 1.01
html/parser/parser_document/css_2021_spec 25834424 ns/iter (± 137858) 25671949 ns/iter (± 42757) 1.01
html/parser/parser_document/github_com_17_05_2022 8593591 ns/iter (± 80881) 8557577 ns/iter (± 15365) 1.00
html/parser/parser_document/stackoverflow_com_17_05_2022 7541105 ns/iter (± 40222) 7421931 ns/iter (± 12056) 1.02
html/parser/parser_document_fragment/css_2021_spec 25535233 ns/iter (± 74406) 25278327 ns/iter (± 40852) 1.01
html/parser/parser_document_fragment/github_com_17_05_2022 8558217 ns/iter (± 10035) 8485562 ns/iter (± 16759) 1.01
html/parser/parser_document_fragment/stackoverflow_com_17_05_2022 7547656 ns/iter (± 68019) 7388785 ns/iter (± 16347) 1.02

This comment was automatically generated by workflow using github-action-benchmark.

Please sign in to comment.