Commit 9ade806
committed
perf: use
[`std::fs::symlink_metadata`](https://doc.rust-lang.org/beta/std/fs/fn.symlink_metadata.html) implementation uses `GetFileInformationByHandle` on Windows, which seems to be known as slow [^1].
This PR adds a function that uses `GetFileAttributesExW` instead of it, which is faster than `GetFileInformationByHandle`.
## Benchmarks
I tested this PR with [rolldown/benchmarks](https://github.com/rolldown/benchmarks). It improved the build time by ~10%
I took the following results with `hyperfine 'node --run build:rolldown'`
### rome
**Before**
```
Benchmark 1: node --run build:rolldown
Time (mean ± σ): 237.7 ms ± 3.7 ms [User: 513.1 ms, System: 495.2 ms]
Range (min … max): 233.1 ms … 243.5 ms 12 runs
```
**After**
```
Benchmark 1: node --run build:rolldown
Time (mean ± σ): 210.4 ms ± 5.3 ms [User: 422.1 ms, System: 443.5 ms]
Range (min … max): 204.1 ms … 223.1 ms 13 runs
```
**Result**: -27.3ms (-11.5%)
### three10x
**Before**
```
Benchmark 1: node --run build:rolldown
Time (mean ± σ): 367.7 ms ± 5.1 ms [User: 1313.1 ms, System: 1283.1 ms]
Range (min … max): 359.7 ms … 374.5 ms 10 runs
```
**After**
```
Benchmark 1: node --run build:rolldown
Time (mean ± σ): 334.3 ms ± 7.5 ms [User: 1094.7 ms, System: 1019.1 ms]
Range (min … max): 324.1 ms … 346.6 ms 10 runs
```
**Result**: -33.4ms (-9.1%)
### apps/10000
**Before**
```
Benchmark 1: node --run build:rolldown
Time (mean ± σ): 2.459 s ± 0.042 s [User: 3.858 s, System: 5.627 s]
Range (min … max): 2.401 s … 2.509 s 10 runs
```
**After**
```
Benchmark 1: node --run build:rolldown
Time (mean ± σ): 1.744 s ± 0.017 s [User: 3.300 s, System: 3.796 s]
Range (min … max): 1.720 s … 1.771 s 10 runs
```
**Result**: -0.72s (-29.1%)
[^1]: gradle/native-platform#203, dotnet/msbuild#2052.GetFileAttributesExW for symlink metadata lookup on Windows (#691)1 parent 9bfd35a commit 9ade806
File tree
6 files changed
+350
-2
lines changed- src
- windows
6 files changed
+350
-2
lines changedSome generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
94 | 94 | | |
95 | 95 | | |
96 | 96 | | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
97 | 100 | | |
98 | 101 | | |
99 | 102 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
95 | 95 | | |
96 | 96 | | |
97 | 97 | | |
| 98 | + | |
98 | 99 | | |
99 | 100 | | |
100 | 101 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
94 | 94 | | |
95 | 95 | | |
96 | 96 | | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
97 | 104 | | |
98 | 105 | | |
99 | 106 | | |
| |||
139 | 146 | | |
140 | 147 | | |
141 | 148 | | |
142 | | - | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
143 | 161 | | |
144 | 162 | | |
145 | 163 | | |
146 | 164 | | |
147 | 165 | | |
148 | 166 | | |
149 | 167 | | |
150 | | - | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
151 | 176 | | |
152 | 177 | | |
153 | 178 | | |
| |||
0 commit comments