Commit f50d7f2
authored
Optimize FlatText.get/3 memory usage and speed (#664)
* Optimize FlatText.get/3 memory usage and speed
Replaced Enum.reduce/3 with an optimal tail-recursive approach in FlatText.
By traversing lists manually, we avoid the overhead of the Enumerable protocol and the allocation of anonymous closures per reduction iteration.
Benchmark results when running Floki.FlatText.get on a large document:
```text
Name ips average deviation median 99th %
Tail recursion 3.21 M 311.16 ns ±23057.88% 50 ns 160 ns
Enum.reduce 2.76 M 361.71 ns ±20499.20% 50 ns 180 ns
Comparison:
Tail recursion 3.21 M
Enum.reduce 2.76 M - 1.16x slower +50.55 ns
Memory usage statistics:
Name Memory usage
Tail recursion 136 B
Enum.reduce 208 B - 1.53x memory usage +72 B
```
* Add tests for FlatText edge cases
* Run formatter1 parent d6f8407 commit f50d7f2
2 files changed
+48
-6
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
20 | | - | |
21 | | - | |
22 | | - | |
| 20 | + | |
23 | 21 | | |
24 | 22 | | |
25 | 23 | | |
| |||
29 | 27 | | |
30 | 28 | | |
31 | 29 | | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
32 | 37 | | |
33 | 38 | | |
34 | 39 | | |
| |||
39 | 44 | | |
40 | 45 | | |
41 | 46 | | |
42 | | - | |
43 | | - | |
44 | | - | |
| 47 | + | |
45 | 48 | | |
46 | 49 | | |
47 | 50 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
84 | 84 | | |
85 | 85 | | |
86 | 86 | | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
87 | 126 | | |
0 commit comments