From 4024d854dbe2239acfc16b415136c88ba1e97336 Mon Sep 17 00:00:00 2001 From: j-mendez Date: Sun, 26 Feb 2023 14:01:37 -0500 Subject: [PATCH 1/6] perf(element): add one sweep element creation --- src/node.rs | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/src/node.rs b/src/node.rs index d1e1b689..7c78e10a 100644 --- a/src/node.rs +++ b/src/node.rs @@ -8,7 +8,6 @@ use std::ops::Deref; use html5ever::tendril::StrTendril; use html5ever::{Attribute, LocalName, QualName}; - use selectors::attr::CaseSensitivity; /// An HTML node. @@ -238,25 +237,24 @@ pub struct Element { impl Element { #[doc(hidden)] - pub fn new(name: QualName, attrs: Vec) -> Self { - let id = attrs - .iter() - .find(|a| a.name.local.deref() == "id") - .map(|a| LocalName::from(a.value.deref())); - - let classes: HashSet = attrs - .iter() - .find(|a| a.name.local.deref() == "class") - .map_or_else(HashSet::new, |a| { - a.value - .deref() - .split_whitespace() - .map(LocalName::from) - .collect() - }); + pub fn new(name: QualName, attributes: Vec) -> Self { + let mut classes: HashSet = HashSet::new(); + let mut id: Option = Option::default(); + let mut attrs = Attributes::with_capacity(attributes.len()); + + for a in attributes { + if a.name.local.deref() == "id" { + id = Some(LocalName::from(a.value.deref())); + } + if a.name.local.deref() == "class" { + classes.extend(a.value.deref().split_whitespace().map(LocalName::from)); + } + + attrs.insert(a.name, a.value); + } Element { - attrs: attrs.into_iter().map(|a| (a.name, a.value)).collect(), + attrs, name, id, classes, From bb935decaaf5c4f8d3d174bb460c85c97f20408b Mon Sep 17 00:00:00 2001 From: j-mendez Date: Sun, 26 Feb 2023 14:14:37 -0500 Subject: [PATCH 2/6] perf(element): add fast value dref handling --- src/node.rs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/node.rs b/src/node.rs index 7c78e10a..37e0abbe 100644 --- a/src/node.rs +++ b/src/node.rs @@ -243,11 +243,18 @@ impl Element { let mut attrs = Attributes::with_capacity(attributes.len()); for a in attributes { - if a.name.local.deref() == "id" { - id = Some(LocalName::from(a.value.deref())); + let name_local = a.name.local.deref(); + let mut value = ""; + + if name_local == "id" { + value = a.value.deref(); + id = Some(LocalName::from(value)); } - if a.name.local.deref() == "class" { - classes.extend(a.value.deref().split_whitespace().map(LocalName::from)); + if name_local == "class" { + if value.is_empty() { + value = a.value.deref(); + } + classes.extend(value.split_whitespace().map(LocalName::from)); } attrs.insert(a.name, a.value); From 5b2cd0f93fcc0d3dc6fced0cc4aefeb0449aba4f Mon Sep 17 00:00:00 2001 From: j-mendez Date: Sun, 26 Feb 2023 14:17:27 -0500 Subject: [PATCH 3/6] chore(minor): add none usage default id --- src/node.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/node.rs b/src/node.rs index 37e0abbe..0a695a5e 100644 --- a/src/node.rs +++ b/src/node.rs @@ -239,8 +239,8 @@ impl Element { #[doc(hidden)] pub fn new(name: QualName, attributes: Vec) -> Self { let mut classes: HashSet = HashSet::new(); - let mut id: Option = Option::default(); let mut attrs = Attributes::with_capacity(attributes.len()); + let mut id: Option = None; for a in attributes { let name_local = a.name.local.deref(); From f941c9c5e8870d5602fee10d8a2b0e5e394e59af Mon Sep 17 00:00:00 2001 From: j-mendez Date: Sun, 26 Feb 2023 14:21:05 -0500 Subject: [PATCH 4/6] chore(minor): add if else value deref --- src/node.rs | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/node.rs b/src/node.rs index 0a695a5e..91e5d8a7 100644 --- a/src/node.rs +++ b/src/node.rs @@ -244,17 +244,11 @@ impl Element { for a in attributes { let name_local = a.name.local.deref(); - let mut value = ""; if name_local == "id" { - value = a.value.deref(); - id = Some(LocalName::from(value)); - } - if name_local == "class" { - if value.is_empty() { - value = a.value.deref(); - } - classes.extend(value.split_whitespace().map(LocalName::from)); + id = Some(LocalName::from(a.value.deref())); + } else if name_local == "class" { + classes.extend(a.value.deref().split_whitespace().map(LocalName::from)); } attrs.insert(a.name, a.value); From 42526344d06b4ecbe4b7d4ed760108b51e96425c Mon Sep 17 00:00:00 2001 From: j-mendez Date: Sun, 26 Feb 2023 14:22:54 -0500 Subject: [PATCH 5/6] chore(minor): revert a.value deref split --- src/node.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/node.rs b/src/node.rs index 91e5d8a7..e6a0a474 100644 --- a/src/node.rs +++ b/src/node.rs @@ -247,7 +247,8 @@ impl Element { if name_local == "id" { id = Some(LocalName::from(a.value.deref())); - } else if name_local == "class" { + } + if name_local == "class" { classes.extend(a.value.deref().split_whitespace().map(LocalName::from)); } From a4f7fbcaa399951a2e303996e12916336fb3e7e3 Mon Sep 17 00:00:00 2001 From: j-mendez Date: Sun, 26 Feb 2023 14:50:38 -0500 Subject: [PATCH 6/6] chore(minor): add match local name deref --- src/node.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/node.rs b/src/node.rs index e6a0a474..37de7a55 100644 --- a/src/node.rs +++ b/src/node.rs @@ -243,15 +243,15 @@ impl Element { let mut id: Option = None; for a in attributes { - let name_local = a.name.local.deref(); - - if name_local == "id" { - id = Some(LocalName::from(a.value.deref())); - } - if name_local == "class" { - classes.extend(a.value.deref().split_whitespace().map(LocalName::from)); - } - + match a.name.local.deref() { + "id" => { + id = Some(LocalName::from(a.value.deref())); + } + "class" => { + classes.extend(a.value.deref().split_whitespace().map(LocalName::from)); + } + _ => (), + }; attrs.insert(a.name, a.value); }