Skip to content

Commit

Permalink
perf(css/minifier): Remove more redundant clones (#6580)
Browse files Browse the repository at this point in the history
  • Loading branch information
kdy1 committed Dec 6, 2022
1 parent 866fd09 commit 4171ee7
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 21 deletions.
16 changes: 16 additions & 0 deletions crates/swc_css_ast/src/base.rs
Expand Up @@ -27,6 +27,12 @@ pub enum Rule {
ListOfComponentValues(Box<ListOfComponentValues>),
}

impl Take for Rule {
fn dummy() -> Self {
Self::QualifiedRule(Take::dummy())
}
}

#[ast_node("QualifiedRule")]
#[derive(Eq, Hash, EqIgnoreSpan)]
pub struct QualifiedRule {
Expand All @@ -35,6 +41,16 @@ pub struct QualifiedRule {
pub block: SimpleBlock,
}

impl Take for QualifiedRule {
fn dummy() -> Self {
Self {
span: Take::dummy(),
prelude: Take::dummy(),
block: Take::dummy(),
}
}
}

#[ast_node]
#[derive(Eq, Hash, Is, EqIgnoreSpan)]
pub enum QualifiedRulePrelude {
Expand Down
78 changes: 57 additions & 21 deletions crates/swc_css_minifier/src/compressor/rules.rs
Expand Up @@ -90,7 +90,12 @@ impl Compressor {
}
}

fn discard_overridden(&self, parent_node: ParentNode, names: &mut AHashMap<Name, isize>) {
fn discard_overridden(
&self,
parent_node: ParentNode,
names: &mut AHashMap<Name, isize>,
remove_rules_list: &mut Vec<usize>,
) {
let mut discarder = |at_rule: &AtRule| match &at_rule.prelude {
Some(box AtRulePrelude::CounterStylePrelude(CustomIdent { value: name, .. })) => {
if let Some(counter) = names.get_mut(&Name::CounterStyle(name.clone())) {
Expand Down Expand Up @@ -134,15 +139,27 @@ impl Compressor {

match parent_node {
ParentNode::Stylesheet(stylesheet) => {
stylesheet.rules.retain(|rule| match rule {
Rule::AtRule(box at_rule) => discarder(at_rule),
_ => true,
});
for index in 0..stylesheet.rules.len() {
let node = stylesheet.rules.get(index);

if let Some(Rule::AtRule(box at_rule)) = node {
if !discarder(at_rule) {
remove_rules_list.push(index);
}
}
}
}
ParentNode::SimpleBlock(simple_block) => {
for index in 0..simple_block.value.len() {
let node = simple_block.value.get(index);

if let Some(ComponentValue::Rule(box Rule::AtRule(box at_rule))) = node {
if !discarder(at_rule) {
remove_rules_list.push(index);
}
}
}
}
ParentNode::SimpleBlock(simple_block) => simple_block.value.retain(|rule| match rule {
ComponentValue::Rule(box Rule::AtRule(box at_rule)) => discarder(at_rule),
_ => true,
}),
}
}

Expand Down Expand Up @@ -337,12 +354,23 @@ impl Compressor {

pub(super) fn compress_stylesheet(&mut self, stylesheet: &mut Stylesheet) {
let mut names: AHashMap<Name, isize> = Default::default();
let mut prev_rule: Option<Rule> = None;
let mut prev_rule_idx = None;
let mut remove_rules_list = vec![];
let mut prev_index = 0;
let mut index = 0;

stylesheet.rules.retain_mut(|rule| {
for index in 0..stylesheet.rules.len() {
// We need two &mut
let (a, b) = stylesheet.rules.split_at_mut(index);

let mut prev_rule = match prev_rule_idx {
Some(idx) => a.get_mut(idx),
None => None,
};
let rule = match b.first_mut() {
Some(v) => v,
None => continue,
};

let result = match rule {
Rule::AtRule(box AtRule {
name: AtRuleName::Ident(Ident { value, .. }),
Expand Down Expand Up @@ -394,25 +422,29 @@ impl Compressor {
if self.is_mergeable_at_rule(at_rule) =>
{
prev_index = index;
prev_rule = Some(rule.clone());
prev_rule_idx = Some(index);
}
Rule::QualifiedRule(_) => {
prev_index = index;
prev_rule = Some(rule.clone());
prev_rule_idx = Some(index);
}
_ => {
prev_rule = None;
prev_rule_idx = None;
}
}

index += 1;
}

result
});
if !result {
remove_rules_list.push(index);
}
}

if !names.is_empty() {
self.discard_overridden(ParentNode::Stylesheet(stylesheet), &mut names);
self.discard_overridden(
ParentNode::Stylesheet(stylesheet),
&mut names,
&mut remove_rules_list,
);
}

if !remove_rules_list.is_empty() {
Expand Down Expand Up @@ -588,7 +620,11 @@ impl Compressor {
});

if !names.is_empty() {
self.discard_overridden(ParentNode::SimpleBlock(simple_block), &mut names);
self.discard_overridden(
ParentNode::SimpleBlock(simple_block),
&mut names,
&mut remove_rules_list,
);
}

if !remove_rules_list.is_empty() {
Expand Down

1 comment on commit 4171ee7

@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: 4171ee7 Previous: 70ac028 Ratio
es/full/bugs-1 336798 ns/iter (± 20258) 351451 ns/iter (± 22878) 0.96
es/full/minify/libraries/antd 1979244445 ns/iter (± 32731422) 2033011685 ns/iter (± 34953270) 0.97
es/full/minify/libraries/d3 441050852 ns/iter (± 36751316) 472046996 ns/iter (± 21570279) 0.93
es/full/minify/libraries/echarts 1691244150 ns/iter (± 21566726) 1739599899 ns/iter (± 20672664) 0.97
es/full/minify/libraries/jquery 110625467 ns/iter (± 6192093) 120770254 ns/iter (± 3493320) 0.92
es/full/minify/libraries/lodash 148604464 ns/iter (± 6984087) 141444213 ns/iter (± 4791323) 1.05
es/full/minify/libraries/moment 68967045 ns/iter (± 2838852) 73592059 ns/iter (± 4144471) 0.94
es/full/minify/libraries/react 24909023 ns/iter (± 1416138) 23665527 ns/iter (± 1646141) 1.05
es/full/minify/libraries/terser 334644360 ns/iter (± 15112694) 366967071 ns/iter (± 6293616) 0.91
es/full/minify/libraries/three 590625615 ns/iter (± 48439705) 643151453 ns/iter (± 22734070) 0.92
es/full/minify/libraries/typescript 3647470583 ns/iter (± 107938311) 3837846518 ns/iter (± 167052390) 0.95
es/full/minify/libraries/victory 884222184 ns/iter (± 7439259) 938503653 ns/iter (± 52163361) 0.94
es/full/minify/libraries/vue 169079020 ns/iter (± 1972068) 197556572 ns/iter (± 9767530) 0.86
es/full/codegen/es3 33561 ns/iter (± 798) 34428 ns/iter (± 1287) 0.97
es/full/codegen/es5 33586 ns/iter (± 359) 34074 ns/iter (± 4675) 0.99
es/full/codegen/es2015 33446 ns/iter (± 834) 34044 ns/iter (± 851) 0.98
es/full/codegen/es2016 32530 ns/iter (± 1056) 34138 ns/iter (± 1786) 0.95
es/full/codegen/es2017 32541 ns/iter (± 1350) 34167 ns/iter (± 3197) 0.95
es/full/codegen/es2018 32608 ns/iter (± 2256) 34367 ns/iter (± 2431) 0.95
es/full/codegen/es2019 33829 ns/iter (± 1863) 34647 ns/iter (± 3683) 0.98
es/full/codegen/es2020 33585 ns/iter (± 380) 34629 ns/iter (± 2430) 0.97
es/full/all/es3 190864663 ns/iter (± 13137513) 220761121 ns/iter (± 23849680) 0.86
es/full/all/es5 200431005 ns/iter (± 14443854) 205212711 ns/iter (± 17687171) 0.98
es/full/all/es2015 143161982 ns/iter (± 7932913) 165493615 ns/iter (± 14742950) 0.87
es/full/all/es2016 144154002 ns/iter (± 8232965) 165807431 ns/iter (± 14765169) 0.87
es/full/all/es2017 142668171 ns/iter (± 9852198) 160548536 ns/iter (± 16179076) 0.89
es/full/all/es2018 142171950 ns/iter (± 8384596) 161154787 ns/iter (± 15008888) 0.88
es/full/all/es2019 141841723 ns/iter (± 5095403) 158910141 ns/iter (± 12307004) 0.89
es/full/all/es2020 133997793 ns/iter (± 5680926) 154555362 ns/iter (± 15091502) 0.87
es/full/parser 695141 ns/iter (± 18698) 744682 ns/iter (± 30584) 0.93
es/full/base/fixer 25090 ns/iter (± 791) 26354 ns/iter (± 1552) 0.95
es/full/base/resolver_and_hygiene 88326 ns/iter (± 3486) 91927 ns/iter (± 4556) 0.96
serialization of ast node 215 ns/iter (± 9) 210 ns/iter (± 2) 1.02
serialization of serde 222 ns/iter (± 9) 223 ns/iter (± 3) 1.00

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

Please sign in to comment.