Skip to content

Commit 9beefaa

Browse files
authoredMar 11, 2023
perf(es/lexer): Use jump table for read_token (#7058)
1 parent fa627e1 commit 9beefaa

File tree

2 files changed

+265
-169
lines changed

2 files changed

+265
-169
lines changed
 

‎crates/swc_ecma_parser/src/lexer/mod.rs

+90-169
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,12 @@ use swc_atoms::{Atom, AtomGenerator};
99
use swc_common::{comments::Comments, input::StringInput, BytePos, Span};
1010
use swc_ecma_ast::{op, EsVersion};
1111

12-
use self::{comments_buffer::CommentsBuffer, state::State, util::*};
12+
use self::{
13+
comments_buffer::CommentsBuffer,
14+
state::State,
15+
table::{ByteHandler, BYTE_HANDLERS},
16+
util::*,
17+
};
1318
pub use self::{
1419
input::Input,
1520
state::{TokenContext, TokenContexts},
@@ -25,6 +30,7 @@ pub mod input;
2530
mod jsx;
2631
mod number;
2732
mod state;
33+
mod table;
2834
#[cfg(test)]
2935
mod tests;
3036
pub mod util;
@@ -161,178 +167,24 @@ impl<'a> Lexer<'a> {
161167

162168
/// babel: `getTokenFromCode`
163169
fn read_token(&mut self) -> LexResult<Option<Token>> {
164-
let c = self.input.cur_as_ascii();
165-
166-
match c {
167-
None => {}
168-
Some(c) => {
169-
match c {
170-
b'#' => return self.read_token_number_sign(),
171-
172-
//
173-
b'.' => return self.read_token_dot().map(Some),
174-
175-
b'(' | b')' | b';' | b',' | b'[' | b']' | b'{' | b'}' | b'@' | b'`' | b'~' => {
176-
// These tokens are emitted directly.
177-
self.input.bump();
178-
return Ok(Some(match c {
179-
b'(' => LParen,
180-
b')' => RParen,
181-
b';' => Semi,
182-
b',' => Comma,
183-
b'[' => LBracket,
184-
b']' => RBracket,
185-
b'{' => LBrace,
186-
b'}' => RBrace,
187-
b'@' => At,
188-
b'`' => tok!('`'),
189-
b'~' => tok!('~'),
190-
191-
_ => unreachable!(),
192-
}));
193-
}
194-
195-
b'?' => return self.read_token_question_mark().map(Some),
196-
197-
b':' => return self.read_token_colon().map(Some),
198-
199-
b'0' => return self.read_token_zero().map(Some),
200-
201-
b'1'..=b'9' => {
202-
return self
203-
.read_number(false)
204-
.map(|v| match v {
205-
Left((value, raw)) => Num { value, raw },
206-
Right((value, raw)) => BigInt { value, raw },
207-
})
208-
.map(Some);
209-
}
210-
211-
b'"' | b'\'' => return self.read_str_lit().map(Some),
212-
213-
b'/' => return self.read_slash(),
214-
215-
b'%' | b'*' => return self.read_token_mul_mod(c).map(Some),
216-
217-
// Logical operators
218-
b'|' | b'&' => return self.read_token_logical(c).map(Some),
219-
b'^' => {
220-
// Bitwise xor
221-
self.input.bump();
222-
return Ok(Some(if self.input.cur() == Some('=') {
223-
self.input.bump();
224-
AssignOp(BitXorAssign)
225-
} else {
226-
BinOp(BitXor)
227-
}));
228-
}
229-
230-
b'+' | b'-' => {
231-
let start = self.cur_pos();
232-
233-
self.input.bump();
234-
235-
// '++', '--'
236-
return Ok(Some(if self.input.cur() == Some(c as char) {
237-
self.input.bump();
238-
239-
// Handle -->
240-
if self.state.had_line_break && c == b'-' && self.eat(b'>') {
241-
self.emit_module_mode_error(
242-
start,
243-
SyntaxError::LegacyCommentInModule,
244-
);
245-
self.skip_line_comment(0);
246-
self.skip_space::<true>()?;
247-
return self.read_token();
248-
}
249-
250-
if c == b'+' {
251-
PlusPlus
252-
} else {
253-
MinusMinus
254-
}
255-
} else if self.input.eat_byte(b'=') {
256-
AssignOp(if c == b'+' { AddAssign } else { SubAssign })
257-
} else {
258-
BinOp(if c == b'+' { Add } else { Sub })
259-
}));
260-
}
261-
262-
b'<' | b'>' => return self.read_token_lt_gt(),
263-
264-
b'!' | b'=' => {
265-
let start = self.cur_pos();
266-
let had_line_break_before_last = self.had_line_break_before_last();
267-
268-
self.input.bump();
269-
270-
return Ok(Some(if self.input.eat_byte(b'=') {
271-
// "=="
272-
273-
if self.input.eat_byte(b'=') {
274-
if c == b'!' {
275-
BinOp(NotEqEq)
276-
} else {
277-
// =======
278-
// ^
279-
if had_line_break_before_last && self.is_str("====") {
280-
self.emit_error_span(
281-
fixed_len_span(start, 7),
282-
SyntaxError::TS1185,
283-
);
284-
self.skip_line_comment(4);
285-
self.skip_space::<true>()?;
286-
return self.read_token();
287-
}
288-
289-
BinOp(EqEqEq)
290-
}
291-
} else if c == b'!' {
292-
BinOp(NotEq)
293-
} else {
294-
BinOp(EqEq)
295-
}
296-
} else if c == b'=' && self.input.eat_byte(b'>') {
297-
// "=>"
298-
299-
Arrow
300-
} else if c == b'!' {
301-
Bang
302-
} else {
303-
AssignOp(Assign)
304-
}));
305-
}
170+
let byte = match self.input.as_str().as_bytes().first() {
171+
Some(&v) => v,
172+
None => return Ok(None),
173+
};
306174

307-
b'a'..=b'z' | b'A'..=b'Z' | b'$' | b'_' | b'\\' => {
308-
// Fast path for ascii identifiers.
309-
return self.read_ident_or_keyword().map(Some);
310-
}
311-
_ => {}
312-
}
313-
}
314-
}
175+
let handler = unsafe { *(&BYTE_HANDLERS as *const ByteHandler).offset(byte as isize) };
315176

316-
let c = match self.input.cur() {
317-
Some(c) => c,
177+
match handler {
178+
Some(handler) => handler(self),
318179
None => {
319-
return Ok(None);
320-
}
321-
};
322-
323-
let token = {
324-
// Identifier or keyword. '\uXXXX' sequences are allowed in
325-
// identifiers, so '\' also dispatches to that.
326-
if c == '\\' || c.is_ident_start() {
327-
return self.read_ident_or_keyword().map(Some);
180+
let start = self.cur_pos();
181+
self.input.bump_bytes(1);
182+
self.error_span(
183+
pos_span(start),
184+
SyntaxError::UnexpectedChar { c: byte as _ },
185+
)
328186
}
329-
330-
let start = self.cur_pos();
331-
self.input.bump();
332-
self.error_span(pos_span(start), SyntaxError::UnexpectedChar { c })?
333-
};
334-
335-
Ok(Some(token))
187+
}
336188
}
337189

338190
/// `#`
@@ -695,6 +547,75 @@ impl<'a> Lexer<'a> {
695547

696548
Ok(Some(vec![c.into()]))
697549
}
550+
551+
fn read_token_plus_minus(&mut self, c: u8) -> LexResult<Option<Token>> {
552+
let start = self.cur_pos();
553+
554+
self.input.bump();
555+
556+
// '++', '--'
557+
Ok(Some(if self.input.cur() == Some(c as char) {
558+
self.input.bump();
559+
560+
// Handle -->
561+
if self.state.had_line_break && c == b'-' && self.eat(b'>') {
562+
self.emit_module_mode_error(start, SyntaxError::LegacyCommentInModule);
563+
self.skip_line_comment(0);
564+
self.skip_space::<true>()?;
565+
return self.read_token();
566+
}
567+
568+
if c == b'+' {
569+
PlusPlus
570+
} else {
571+
MinusMinus
572+
}
573+
} else if self.input.eat_byte(b'=') {
574+
AssignOp(if c == b'+' { AddAssign } else { SubAssign })
575+
} else {
576+
BinOp(if c == b'+' { Add } else { Sub })
577+
}))
578+
}
579+
580+
fn read_token_bang_or_eq(&mut self, c: u8) -> LexResult<Option<Token>> {
581+
let start = self.cur_pos();
582+
let had_line_break_before_last = self.had_line_break_before_last();
583+
584+
self.input.bump();
585+
586+
Ok(Some(if self.input.eat_byte(b'=') {
587+
// "=="
588+
589+
if self.input.eat_byte(b'=') {
590+
if c == b'!' {
591+
BinOp(NotEqEq)
592+
} else {
593+
// =======
594+
// ^
595+
if had_line_break_before_last && self.is_str("====") {
596+
self.emit_error_span(fixed_len_span(start, 7), SyntaxError::TS1185);
597+
self.skip_line_comment(4);
598+
self.skip_space::<true>()?;
599+
return self.read_token();
600+
}
601+
602+
BinOp(EqEqEq)
603+
}
604+
} else if c == b'!' {
605+
BinOp(NotEq)
606+
} else {
607+
BinOp(EqEq)
608+
}
609+
} else if c == b'=' && self.input.eat_byte(b'>') {
610+
// "=>"
611+
612+
Arrow
613+
} else if c == b'!' {
614+
Bang
615+
} else {
616+
AssignOp(Assign)
617+
}))
618+
}
698619
}
699620

700621
impl<'a> Lexer<'a> {
+175
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
//! Lookup table for byte handlers.
2+
//!
3+
//! Idea is taken from ratel.
4+
//!
5+
//! https://github.com/ratel-rust/ratel-core/blob/e55a1310ba69a3f5ce2a9a6eef643feced02ac08/ratel/src/lexer/mod.rs#L665
6+
7+
use either::Either;
8+
use swc_common::input::Input;
9+
10+
use super::{pos_span, util::CharExt, LexResult, Lexer};
11+
use crate::{
12+
error::SyntaxError,
13+
token::{AssignOpToken, BinOpToken, Token},
14+
};
15+
16+
pub(super) type ByteHandler = Option<for<'aa> fn(&mut Lexer<'aa>) -> LexResult<Option<Token>>>;
17+
18+
/// Lookup table mapping any incoming byte to a handler function defined below.
19+
pub(super) static BYTE_HANDLERS: [ByteHandler; 256] = [
20+
// 0 1 2 3 4 5 6 7 8 9 A B C D E F //
21+
EOF, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, // 0
22+
___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, ___, // 1
23+
___, EXL, QOT, HSH, IDT, PRC, AMP, QOT, PNO, PNC, ATR, PLS, COM, MIN, PRD, SLH, // 2
24+
ZER, DIG, DIG, DIG, DIG, DIG, DIG, DIG, DIG, DIG, COL, SEM, LSS, EQL, MOR, QST, // 3
25+
AT_, IDT, IDT, IDT, IDT, IDT, IDT, IDT, IDT, IDT, IDT, IDT, IDT, IDT, IDT, IDT, // 4
26+
IDT, IDT, IDT, IDT, IDT, IDT, IDT, IDT, IDT, IDT, IDT, BTO, IDT, BTC, CRT, IDT, // 5
27+
TPL, IDT, IDT, IDT, IDT, IDT, IDT, IDT, IDT, IDT, IDT, IDT, IDT, IDT, IDT, IDT, // 6
28+
IDT, IDT, IDT, IDT, IDT, IDT, IDT, IDT, IDT, IDT, IDT, BEO, PIP, BEC, TLD, ERR, // 7
29+
UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, // 8
30+
UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, // 9
31+
UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, // A
32+
UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, // B
33+
UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, // C
34+
UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, // D
35+
UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, // E
36+
UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, UNI, // F
37+
];
38+
39+
const ___: ByteHandler = None;
40+
41+
const EOF: ByteHandler = Some(|lexer| {
42+
lexer.input.bump_bytes(1);
43+
44+
Ok(None)
45+
});
46+
47+
const ERR: ByteHandler = Some(|lexer| {
48+
let c = unsafe {
49+
// Safety: Byte handler is only called for non-last chracters
50+
lexer.input.cur().unwrap_unchecked()
51+
};
52+
53+
let start = lexer.cur_pos();
54+
lexer.input.bump();
55+
lexer.error_span(pos_span(start), SyntaxError::UnexpectedChar { c })?
56+
});
57+
58+
/// Identifier
59+
const IDT: ByteHandler = Some(|lexer| lexer.read_ident_or_keyword().map(Some));
60+
61+
/// `0`
62+
const ZER: ByteHandler = Some(|lexer| lexer.read_token_zero().map(Some));
63+
64+
/// Numbers
65+
const DIG: ByteHandler = Some(|lexer| {
66+
lexer
67+
.read_number(false)
68+
.map(|v| match v {
69+
Either::Left((value, raw)) => Token::Num { value, raw },
70+
Either::Right((value, raw)) => Token::BigInt { value, raw },
71+
})
72+
.map(Some)
73+
});
74+
75+
/// String literals with `'` or `"`
76+
const QOT: ByteHandler = Some(|lexer| lexer.read_str_lit().map(Some));
77+
78+
/// Unicode
79+
const UNI: ByteHandler = Some(|lexer| {
80+
let c = unsafe {
81+
// Safety: Byte handler is only called for non-last chracters
82+
lexer.input.cur().unwrap_unchecked()
83+
};
84+
85+
// Identifier or keyword. '\uXXXX' sequences are allowed in
86+
// identifiers, so '\' also dispatches to that.
87+
if c == '\\' || c.is_ident_start() {
88+
return lexer.read_ident_or_keyword().map(Some);
89+
}
90+
91+
let start = lexer.cur_pos();
92+
lexer.input.bump();
93+
lexer.error_span(pos_span(start), SyntaxError::UnexpectedChar { c })?
94+
});
95+
96+
/// `:`
97+
const COL: ByteHandler = Some(|lexer| lexer.read_token_colon().map(Some));
98+
99+
/// `%`
100+
const PRC: ByteHandler = Some(|lexer| lexer.read_token_mul_mod(b'%').map(Some));
101+
102+
/// `*`
103+
const ATR: ByteHandler = Some(|lexer| lexer.read_token_mul_mod(b'*').map(Some));
104+
105+
/// `?`
106+
const QST: ByteHandler = Some(|lexer| lexer.read_token_question_mark().map(Some));
107+
108+
/// `&`
109+
const AMP: ByteHandler = Some(|lexer| lexer.read_token_logical(b'&').map(Some));
110+
111+
/// `|`
112+
const PIP: ByteHandler = Some(|lexer| lexer.read_token_logical(b'|').map(Some));
113+
114+
macro_rules! single_char {
115+
($name:ident, $c:literal, $token:ident) => {
116+
const $name: ByteHandler = Some(|lexer| {
117+
lexer.input.bump_bytes(1);
118+
Ok(Some(Token::$token))
119+
});
120+
};
121+
}
122+
123+
single_char!(SEM, b';', Semi);
124+
single_char!(COM, b',', Comma);
125+
single_char!(TPL, b'`', BackQuote);
126+
single_char!(TLD, b'~', Tilde);
127+
single_char!(AT_, b'@', At);
128+
129+
single_char!(PNO, b'(', LParen);
130+
single_char!(PNC, b')', RParen);
131+
132+
single_char!(BTO, b'[', LBracket);
133+
single_char!(BTC, b']', RBracket);
134+
135+
single_char!(BEO, b'{', LBrace);
136+
single_char!(BEC, b'}', RBrace);
137+
138+
/// `^`
139+
const CRT: ByteHandler = Some(|lexer| {
140+
// Bitwise xor
141+
lexer.input.bump_bytes(1);
142+
Ok(Some(if lexer.input.cur_as_ascii() == Some(b'=') {
143+
lexer.input.bump_bytes(1);
144+
Token::AssignOp(AssignOpToken::BitXorAssign)
145+
} else {
146+
Token::BinOp(BinOpToken::BitXor)
147+
}))
148+
});
149+
150+
/// `+`
151+
const PLS: ByteHandler = Some(|lexer| lexer.read_token_plus_minus(b'+'));
152+
153+
/// `-`
154+
const MIN: ByteHandler = Some(|lexer| lexer.read_token_plus_minus(b'-'));
155+
156+
/// `!`
157+
const EXL: ByteHandler = Some(|lexer| lexer.read_token_bang_or_eq(b'!'));
158+
159+
/// `=`
160+
const EQL: ByteHandler = Some(|lexer| lexer.read_token_bang_or_eq(b'='));
161+
162+
/// `.`
163+
const PRD: ByteHandler = Some(|lexer| lexer.read_token_dot().map(Some));
164+
165+
/// `<`
166+
const LSS: ByteHandler = Some(|lexer| lexer.read_token_lt_gt());
167+
168+
/// `>`
169+
const MOR: ByteHandler = Some(|lexer| lexer.read_token_lt_gt());
170+
171+
/// `/`
172+
const SLH: ByteHandler = Some(|lexer| lexer.read_slash());
173+
174+
/// `#`
175+
const HSH: ByteHandler = Some(|lexer| lexer.read_token_number_sign());

1 commit comments

Comments
 (1)

github-actions[bot] commented on Mar 11, 2023

@github-actions[bot]

Benchmark

Benchmark suite Current: 9beefaa Previous: fbb3016 Ratio
es/full/bugs-1 316228 ns/iter (± 8679) 301755 ns/iter (± 7533) 1.05
es/full/minify/libraries/antd 1589467448 ns/iter (± 21828492) 1439697968 ns/iter (± 30162675) 1.10
es/full/minify/libraries/d3 303569507 ns/iter (± 8096583) 283195212 ns/iter (± 5600633) 1.07
es/full/minify/libraries/echarts 1232522903 ns/iter (± 13889498) 1116629304 ns/iter (± 25024911) 1.10
es/full/minify/libraries/jquery 91945402 ns/iter (± 640136) 86571867 ns/iter (± 1150905) 1.06
es/full/minify/libraries/lodash 106431008 ns/iter (± 1089162) 100583171 ns/iter (± 1316174) 1.06
es/full/minify/libraries/moment 52847404 ns/iter (± 548584) 49933985 ns/iter (± 593495) 1.06
es/full/minify/libraries/react 19420114 ns/iter (± 256531) 18501213 ns/iter (± 88764) 1.05
es/full/minify/libraries/terser 250062904 ns/iter (± 4420099) 229445993 ns/iter (± 4158921) 1.09
es/full/minify/libraries/three 442376180 ns/iter (± 13549322) 402659824 ns/iter (± 8750555) 1.10
es/full/minify/libraries/typescript 2988207883 ns/iter (± 21239955) 2763199193 ns/iter (± 16208770) 1.08
es/full/minify/libraries/victory 669356674 ns/iter (± 8720596) 584791192 ns/iter (± 5894515) 1.14
es/full/minify/libraries/vue 132808567 ns/iter (± 949060) 122080456 ns/iter (± 765656) 1.09
es/full/codegen/es3 26178 ns/iter (± 64) 25206 ns/iter (± 171) 1.04
es/full/codegen/es5 26292 ns/iter (± 51) 25518 ns/iter (± 127) 1.03
es/full/codegen/es2015 26259 ns/iter (± 59) 25089 ns/iter (± 134) 1.05
es/full/codegen/es2016 26272 ns/iter (± 67) 25179 ns/iter (± 241) 1.04
es/full/codegen/es2017 26243 ns/iter (± 31) 25450 ns/iter (± 373) 1.03
es/full/codegen/es2018 26286 ns/iter (± 58) 25319 ns/iter (± 93) 1.04
es/full/codegen/es2019 26224 ns/iter (± 64) 25863 ns/iter (± 513) 1.01
es/full/codegen/es2020 26261 ns/iter (± 63) 25107 ns/iter (± 284) 1.05
es/full/all/es3 174990710 ns/iter (± 2833298) 171971839 ns/iter (± 2680310) 1.02
es/full/all/es5 162172676 ns/iter (± 2623244) 165102512 ns/iter (± 3839537) 0.98
es/full/all/es2015 128334540 ns/iter (± 1987942) 125162076 ns/iter (± 2283377) 1.03
es/full/all/es2016 126678101 ns/iter (± 3093983) 123676380 ns/iter (± 1167597) 1.02
es/full/all/es2017 125185410 ns/iter (± 1206712) 122823662 ns/iter (± 1900584) 1.02
es/full/all/es2018 121617412 ns/iter (± 1232328) 120727024 ns/iter (± 1032090) 1.01
es/full/all/es2019 121599783 ns/iter (± 1140294) 120284375 ns/iter (± 1492429) 1.01
es/full/all/es2020 115930081 ns/iter (± 584043) 115529217 ns/iter (± 1798364) 1.00
es/full/parser 534538 ns/iter (± 8419) 522469 ns/iter (± 9554) 1.02
es/full/base/fixer 23614 ns/iter (± 45) 21363 ns/iter (± 164) 1.11
es/full/base/resolver_and_hygiene 82260 ns/iter (± 91) 78622 ns/iter (± 749) 1.05
serialization of ast node 124 ns/iter (± 0) 119 ns/iter (± 0) 1.04
serialization of serde 126 ns/iter (± 0) 123 ns/iter (± 0) 1.02
css/minify/libraries/bootstrap 28599230 ns/iter (± 151909) 27695250 ns/iter (± 322663) 1.03
css/visitor/compare/clone 2107060 ns/iter (± 18885) 2110859 ns/iter (± 21857) 1.00
css/visitor/compare/visit_mut_span 2291270 ns/iter (± 10869) 2249743 ns/iter (± 12837) 1.02
css/visitor/compare/visit_mut_span_panic 2374367 ns/iter (± 5203) 2322964 ns/iter (± 23638) 1.02
css/visitor/compare/fold_span 3080608 ns/iter (± 16478) 3063436 ns/iter (± 16103) 1.01
css/visitor/compare/fold_span_panic 3213037 ns/iter (± 19028) 3169562 ns/iter (± 47112) 1.01
css/lexer/bootstrap_5_1_3 5135469 ns/iter (± 1255) 5165683 ns/iter (± 43708) 0.99
css/lexer/foundation_6_7_4 4331026 ns/iter (± 1100) 4233098 ns/iter (± 21344) 1.02
css/lexer/tailwind_3_1_1 821897 ns/iter (± 531) 823517 ns/iter (± 4364) 1.00
css/parser/bootstrap_5_1_3 21850933 ns/iter (± 111987) 21614102 ns/iter (± 183708) 1.01
css/parser/foundation_6_7_4 17418079 ns/iter (± 59395) 17354493 ns/iter (± 81720) 1.00
css/parser/tailwind_3_1_1 3301752 ns/iter (± 2145) 3292173 ns/iter (± 20875) 1.00
es/codegen/colors 328906 ns/iter (± 183818) 334876 ns/iter (± 187466) 0.98
es/codegen/large 1182128 ns/iter (± 606884) 1260923 ns/iter (± 649697) 0.94
es/codegen/with-parser/colors 46063 ns/iter (± 140) 47338 ns/iter (± 550) 0.97
es/codegen/with-parser/large 510543 ns/iter (± 1324) 506480 ns/iter (± 7444) 1.01
es/minify/libraries/antd 1407877136 ns/iter (± 18223088) 1308346788 ns/iter (± 37056659) 1.08
es/minify/libraries/d3 267531585 ns/iter (± 4594788) 253544270 ns/iter (± 7167016) 1.06
es/minify/libraries/echarts 1062463529 ns/iter (± 11283751) 975686658 ns/iter (± 19471774) 1.09
es/minify/libraries/jquery 79279509 ns/iter (± 560489) 78095048 ns/iter (± 1342854) 1.02
es/minify/libraries/lodash 95332236 ns/iter (± 1925771) 92175044 ns/iter (± 1473067) 1.03
es/minify/libraries/moment 45949792 ns/iter (± 547707) 45025337 ns/iter (± 503998) 1.02
es/minify/libraries/react 17331041 ns/iter (± 172540) 16723110 ns/iter (± 149500) 1.04
es/minify/libraries/terser 214215014 ns/iter (± 4203195) 202347090 ns/iter (± 6722573) 1.06
es/minify/libraries/three 372614304 ns/iter (± 5314341) 337958233 ns/iter (± 8756811) 1.10
es/minify/libraries/typescript 2537385870 ns/iter (± 13659169) 2390063095 ns/iter (± 27458678) 1.06
es/minify/libraries/victory 589826174 ns/iter (± 9282944) 497346367 ns/iter (± 7076740) 1.19
es/minify/libraries/vue 117657732 ns/iter (± 1371028) 112739356 ns/iter (± 1680631) 1.04
es/visitor/compare/clone 2361780 ns/iter (± 13175) 2328368 ns/iter (± 15785) 1.01
es/visitor/compare/visit_mut_span 2754217 ns/iter (± 13258) 2634718 ns/iter (± 30114) 1.05
es/visitor/compare/visit_mut_span_panic 2792585 ns/iter (± 10967) 2699391 ns/iter (± 54090) 1.03
es/visitor/compare/fold_span 3843113 ns/iter (± 15907) 3728847 ns/iter (± 51797) 1.03
es/visitor/compare/fold_span_panic 4035049 ns/iter (± 27840) 3960995 ns/iter (± 21178) 1.02
es/lexer/colors 15429 ns/iter (± 13) 14977 ns/iter (± 118) 1.03
es/lexer/angular 7643427 ns/iter (± 3834) 7407273 ns/iter (± 70148) 1.03
es/lexer/backbone 982072 ns/iter (± 589) 974806 ns/iter (± 4205) 1.01
es/lexer/jquery 5485861 ns/iter (± 4034) 5410234 ns/iter (± 61918) 1.01
es/lexer/jquery mobile 8469190 ns/iter (± 5569) 8284175 ns/iter (± 56548) 1.02
es/lexer/mootools 4333424 ns/iter (± 2523) 4311684 ns/iter (± 52276) 1.01
es/lexer/underscore 824414 ns/iter (± 354) 805008 ns/iter (± 4782) 1.02
es/lexer/three 25647840 ns/iter (± 48152) 25082903 ns/iter (± 124981) 1.02
es/lexer/yui 4666269 ns/iter (± 1074) 4485420 ns/iter (± 29126) 1.04
es/parser/colors 29634 ns/iter (± 54) 29414 ns/iter (± 331) 1.01
es/parser/angular 15783425 ns/iter (± 118111) 14632438 ns/iter (± 154745) 1.08
es/parser/backbone 2250593 ns/iter (± 13205) 2188248 ns/iter (± 22795) 1.03
es/parser/jquery 12359690 ns/iter (± 99401) 11873945 ns/iter (± 89400) 1.04
es/parser/jquery mobile 19733513 ns/iter (± 253806) 18917672 ns/iter (± 248849) 1.04
es/parser/mootools 9414575 ns/iter (± 55518) 9285180 ns/iter (± 52602) 1.01
es/parser/underscore 1907420 ns/iter (± 10022) 1900956 ns/iter (± 9577) 1.00
es/parser/three 56711521 ns/iter (± 427598) 51258673 ns/iter (± 1278805) 1.11
es/parser/yui 9373301 ns/iter (± 76081) 8986198 ns/iter (± 91181) 1.04
es/preset-env/usage/builtin_type 141203 ns/iter (± 32803) 139824 ns/iter (± 32816) 1.01
es/preset-env/usage/property 21639 ns/iter (± 30) 20031 ns/iter (± 119) 1.08
es/resolver/typescript 107183732 ns/iter (± 1737405) 101347449 ns/iter (± 4068104) 1.06
es/fixer/typescript 78433217 ns/iter (± 241401) 76697188 ns/iter (± 2443291) 1.02
es/hygiene/typescript 169307006 ns/iter (± 2691387) 163268032 ns/iter (± 906797) 1.04
es/resolver_with_hygiene/typescript 306203131 ns/iter (± 2350724) 295353438 ns/iter (± 3697021) 1.04
es/visitor/base-perf/module_clone 77763 ns/iter (± 1796) 75376 ns/iter (± 1905) 1.03
es/visitor/base-perf/fold_empty 86861 ns/iter (± 1523) 85143 ns/iter (± 1684) 1.02
es/visitor/base-perf/fold_noop_impl_all 87699 ns/iter (± 1710) 84882 ns/iter (± 1332) 1.03
es/visitor/base-perf/fold_noop_impl_vec 88077 ns/iter (± 1833) 86988 ns/iter (± 1757) 1.01
es/visitor/base-perf/boxing_boxed_clone 57 ns/iter (± 0) 56 ns/iter (± 0) 1.02
es/visitor/base-perf/boxing_unboxed_clone 54 ns/iter (± 0) 54 ns/iter (± 0) 1
es/visitor/base-perf/boxing_boxed 103 ns/iter (± 0) 98 ns/iter (± 0) 1.05
es/visitor/base-perf/boxing_unboxed 97 ns/iter (± 0) 96 ns/iter (± 0) 1.01
es/visitor/base-perf/visit_contains_this 3477 ns/iter (± 90) 3493 ns/iter (± 37) 1.00
es/base/parallel/resolver/typescript 4864635544 ns/iter (± 375078788) 5285036182 ns/iter (± 495612630) 0.92
es/base/parallel/hygiene/typescript 1981060742 ns/iter (± 27958056) 1951284413 ns/iter (± 11682399) 1.02
misc/visitors/time-complexity/time 5 97 ns/iter (± 0) 102 ns/iter (± 0) 0.95
misc/visitors/time-complexity/time 10 329 ns/iter (± 0) 335 ns/iter (± 11) 0.98
misc/visitors/time-complexity/time 15 657 ns/iter (± 0) 692 ns/iter (± 22) 0.95
misc/visitors/time-complexity/time 20 1229 ns/iter (± 13) 1267 ns/iter (± 6) 0.97
misc/visitors/time-complexity/time 40 6192 ns/iter (± 2) 6749 ns/iter (± 30) 0.92
misc/visitors/time-complexity/time 60 15569 ns/iter (± 7) 17205 ns/iter (± 150) 0.90
es/full-target/es2016 189258 ns/iter (± 314) 188035 ns/iter (± 560) 1.01
es/full-target/es2017 184628 ns/iter (± 592) 182187 ns/iter (± 603) 1.01
es/full-target/es2018 173668 ns/iter (± 652) 171780 ns/iter (± 840) 1.01
es2020_nullish_coalescing 67593 ns/iter (± 127) 67021 ns/iter (± 169) 1.01
es2020_optional_chaining 96624 ns/iter (± 333) 96386 ns/iter (± 8451) 1.00
es2022_class_properties 94474 ns/iter (± 246) 93230 ns/iter (± 305) 1.01
es2018_object_rest_spread 71958 ns/iter (± 135) 71516 ns/iter (± 141) 1.01
es2019_optional_catch_binding 62357 ns/iter (± 134) 61114 ns/iter (± 208) 1.02
es2017_async_to_generator 62369 ns/iter (± 107) 61594 ns/iter (± 198) 1.01
es2016_exponentiation 66283 ns/iter (± 105) 65317 ns/iter (± 267) 1.01
es2015_arrow 70101 ns/iter (± 78) 69635 ns/iter (± 238) 1.01
es2015_block_scoped_fn 67288 ns/iter (± 156) 66181 ns/iter (± 315) 1.02
es2015_block_scoping 139444 ns/iter (± 6583) 137303 ns/iter (± 685) 1.02
es2015_classes 118229 ns/iter (± 466) 116872 ns/iter (± 301) 1.01
es2015_computed_props 62214 ns/iter (± 90) 61288 ns/iter (± 171) 1.02
es2015_destructuring 117163 ns/iter (± 389) 117451 ns/iter (± 555) 1.00
es2015_duplicate_keys 64661 ns/iter (± 124) 63499 ns/iter (± 235) 1.02
es2015_parameters 80902 ns/iter (± 122) 79652 ns/iter (± 330) 1.02
es2015_fn_name 67422 ns/iter (± 399) 66404 ns/iter (± 647) 1.02
es2015_for_of 65266 ns/iter (± 117) 64039 ns/iter (± 449) 1.02
es2015_instanceof 64445 ns/iter (± 86) 63256 ns/iter (± 221) 1.02
es2015_shorthand_property 61761 ns/iter (± 91) 60917 ns/iter (± 365) 1.01
es2015_spread 61917 ns/iter (± 77) 60938 ns/iter (± 137) 1.02
es2015_sticky_regex 63461 ns/iter (± 96) 62374 ns/iter (± 191) 1.02
es2015_typeof_symbol 63173 ns/iter (± 95) 62364 ns/iter (± 84) 1.01
es/transform/baseline/base 52620 ns/iter (± 56) 51490 ns/iter (± 227) 1.02
es/transform/baseline/common_reserved_word 63636 ns/iter (± 110) 63052 ns/iter (± 131) 1.01
es/transform/baseline/common_typescript 142833 ns/iter (± 354) 167511 ns/iter (± 397) 0.85
es/target/es3 170781 ns/iter (± 170) 169466 ns/iter (± 285) 1.01
es/target/es2015 632274 ns/iter (± 1191) 627546 ns/iter (± 2234) 1.01
es/target/es2016 66253 ns/iter (± 109) 65400 ns/iter (± 163) 1.01
es/target/es2017 62444 ns/iter (± 147) 61785 ns/iter (± 367) 1.01
es/target/es2018 82170 ns/iter (± 141) 81636 ns/iter (± 217) 1.01
es/target/es2020 133675 ns/iter (± 210) 133294 ns/iter (± 417) 1.00
babelify-only 679401 ns/iter (± 9207) 668885 ns/iter (± 4490) 1.02
parse_and_babelify_angular 45672767 ns/iter (± 1243075) 44735247 ns/iter (± 738614) 1.02
parse_and_babelify_backbone 5511518 ns/iter (± 60785) 5399517 ns/iter (± 66577) 1.02
parse_and_babelify_jquery 32518643 ns/iter (± 919592) 31077300 ns/iter (± 382571) 1.05
parse_and_babelify_jquery_mobile 56371754 ns/iter (± 956671) 52337561 ns/iter (± 717690) 1.08
parse_and_babelify_mootools 33829593 ns/iter (± 518571) 32392512 ns/iter (± 495018) 1.04
parse_and_babelify_underscore 4360509 ns/iter (± 46527) 4265521 ns/iter (± 29769) 1.02
parse_and_babelify_yui 33886593 ns/iter (± 737284) 31785304 ns/iter (± 525010) 1.07
html/minify/document/css_spec 43791040 ns/iter (± 483221) 42045594 ns/iter (± 416011) 1.04
html/minify/document/github 17835001 ns/iter (± 101535) 17478857 ns/iter (± 56266) 1.02
html/minify/document/stackoverflow 15951789 ns/iter (± 104233) 15692889 ns/iter (± 52735) 1.02
html/minify/document_fragment/css_spec 41867335 ns/iter (± 333076) 39733949 ns/iter (± 223939) 1.05
html/minify/document_fragment/github 17003483 ns/iter (± 51360) 16688373 ns/iter (± 54698) 1.02
html/minify/document_fragment/stackoverflow 15387097 ns/iter (± 77696) 15255229 ns/iter (± 60271) 1.01
html/document/visitor/compare/clone 343577 ns/iter (± 1781) 341115 ns/iter (± 2009) 1.01
html/document/visitor/compare/visit_mut_span 370500 ns/iter (± 1826) 366030 ns/iter (± 2195) 1.01
html/document/visitor/compare/visit_mut_span_panic 379342 ns/iter (± 2273) 376164 ns/iter (± 1699) 1.01
html/document/visitor/compare/fold_span 408078 ns/iter (± 1686) 402728 ns/iter (± 2135) 1.01
html/document/visitor/compare/fold_span_panic 465350 ns/iter (± 1205) 459246 ns/iter (± 1837) 1.01
html/document_fragment/visitor/compare/clone 342910 ns/iter (± 2287) 337988 ns/iter (± 1682) 1.01
html/document_fragment/visitor/compare/visit_mut_span 367800 ns/iter (± 1863) 366475 ns/iter (± 7125) 1.00
html/document_fragment/visitor/compare/visit_mut_span_panic 381867 ns/iter (± 2771) 372245 ns/iter (± 2255) 1.03
html/document_fragment/visitor/compare/fold_span 411443 ns/iter (± 1939) 404601 ns/iter (± 2331) 1.02
html/document_fragment/visitor/compare/fold_span_panic 462120 ns/iter (± 2466) 460167 ns/iter (± 2630) 1.00
html/lexer/css_2021_spec 15490740 ns/iter (± 6781) 15433036 ns/iter (± 54800) 1.00
html/lexer/github_com_17_05_2022 5973797 ns/iter (± 2137) 5921030 ns/iter (± 9670) 1.01
html/lexer/stackoverflow_com_17_05_2022 5576863 ns/iter (± 1092) 5553368 ns/iter (± 9251) 1.00
html/parser/parser_document/css_2021_spec 26620179 ns/iter (± 398884) 26118689 ns/iter (± 409858) 1.02
html/parser/parser_document/github_com_17_05_2022 8794393 ns/iter (± 16904) 8756527 ns/iter (± 16702) 1.00
html/parser/parser_document/stackoverflow_com_17_05_2022 7690204 ns/iter (± 7991) 7671563 ns/iter (± 15954) 1.00
html/parser/parser_document_fragment/css_2021_spec 26831307 ns/iter (± 225186) 25949001 ns/iter (± 134062) 1.03
html/parser/parser_document_fragment/github_com_17_05_2022 8819990 ns/iter (± 60170) 8769966 ns/iter (± 79058) 1.01
html/parser/parser_document_fragment/stackoverflow_com_17_05_2022 7759943 ns/iter (± 12279) 7670221 ns/iter (± 18335) 1.01

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

Please sign in to comment.