Use SmolStr in more places of the compiler infrastructure

This removes a lot of allocations and speeds up the compiler step
a bit. Sadly, this patch is very invasive as it touches a lot of
files. That said, each individual hunk is pretty trivial.

For a non-trivial real-world example, the impact is significant,
we get rid of ~29% of all allocations and improve the runtime by
about 4.8% (measured until the viewer loop would start).

Before:
```
Benchmark 1: ./target/release/slint-viewer ../slint-perf/app.slint
  Time (mean ± σ):     664.2 ms ±   6.7 ms    [User: 589.2 ms, System: 74.0 ms]
  Range (min … max):   659.0 ms … 682.4 ms    10 runs

        allocations:            4886888
        temporary allocations:  857508
```

After:
```
Benchmark 1: ./target/release/slint-viewer ../slint-perf/app.slint
  Time (mean ± σ):     639.5 ms ±  17.8 ms    [User: 556.9 ms, System: 76.2 ms]
  Range (min … max):   621.4 ms … 666.5 ms    10 runs

        allocations:            3544318
        temporary allocations:  495685
```
This commit is contained in:
Milian Wolff 2024-10-03 18:06:59 +02:00 committed by Olivier Goffart
parent 08a3a6cc4a
commit 0f6c3a4fd7
75 changed files with 679 additions and 555 deletions

View file

@ -130,7 +130,7 @@ impl NamedReference {
.borrow()
.property_analysis
.borrow_mut()
.entry(self.name().to_owned())
.entry(self.name().into())
.or_default()
.is_set = true;
mark_property_set_derived_in_base(element, self.name())
@ -230,7 +230,7 @@ pub(crate) fn mark_property_set_derived_in_base(mut element: ElementRc, name: &s
if element.borrow().property_declarations.contains_key(name) {
return;
};
match c.root_element.borrow().property_analysis.borrow_mut().entry(name.to_owned()) {
match c.root_element.borrow().property_analysis.borrow_mut().entry(name.into()) {
std::collections::hash_map::Entry::Occupied(e) if e.get().is_set_externally => {
return;
}
@ -256,7 +256,7 @@ pub(crate) fn mark_property_read_derived_in_base(mut element: ElementRc, name: &
if element.borrow().property_declarations.contains_key(name) {
return;
};
match c.root_element.borrow().property_analysis.borrow_mut().entry(name.to_owned()) {
match c.root_element.borrow().property_analysis.borrow_mut().entry(name.into()) {
std::collections::hash_map::Entry::Occupied(e) if e.get().is_read_externally => {
return;
}