rust / expert
Snippet
Optimierung benutzerdefinierter Iteratoren durch Überschreiben von Fold
Während die standardmäßige externe Iteration next() verwendet, führt die interne Iteration über die fold-Methode oft zu einer besseren Leistung. Durch das Überschreiben von fold bei einem benutzerdefinierten Iterator umgehen wir die wiederholten Zustandsprüfungen und den Setup-Overhead von next(), wodurch der Compiler das Entrollen von Schleifen und die Registerallokation optimieren kann.
snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
struct StepByTwo {current: usize,end: usize,}impl Iterator for StepByTwo {type Item = usize;fn next(&mut self) -> Option<Self::Item> {if self.current < self.end {let val = self.current;self.current += 2;Some(val)} else {None}}fn fold<B, F>(mut self, init: B, mut f: F) -> BwhereF: FnMut(B, Self::Item) -> B,{let mut accum = init;while self.current < self.end {accum = f(accum, self.current);self.current += 2;}accum}}
Erklärung
1
fn fold<B, F>(mut self, init: B, mut f: F) -> B
Überschreibt die Standard-fold-Methode, um eine benutzerdefinierte interne Iteration zu implementieren.
2
while self.current < self.end {
Iteriert mithilfe einer schnellen, lokalen while-Schleife, anstatt die Kontrolle an einen next()-Aufrufer zurückzugeben.
3
accum = f(accum, self.current);
Leitet den Akkumulator direkt durch das Closure und minimiert so Zustandsübergänge.