]> git.lizzy.rs Git - rust.git/commit - src/tools/rust-analyzer
Auto merge of #88060 - TennyZhuang:optimize-vec-retain, r=dtolnay
authorbors <bors@rust-lang.org>
Sun, 3 Oct 2021 06:24:06 +0000 (06:24 +0000)
committerbors <bors@rust-lang.org>
Sun, 3 Oct 2021 06:24:06 +0000 (06:24 +0000)
commitc24c9067eec3aec8dd2013d24f6cd0dff3ecec4c
treeb62248940bca22a87b7914bab51600d62b5dd246
parent77f1e504a953efbbd59673a75c3cd530d5b3c530
parent3839ca9953e47ad91751fdfffa10c9ae8a210e3c
Auto merge of #88060 - TennyZhuang:optimize-vec-retain, r=dtolnay

Optimize unnecessary check in Vec::retain

The function `vec::Vec::retain` only have two stages:

1. Nothing was deleted.
2. Some elements were deleted.

Here is an unnecessary check `if g.deleted_cnt > 0` in the loop, and it's difficult for compiler to optimize it. I split the loop into two stages manully and keep the code clean using const generics.

I write a special but common bench case for this optimization. I call retain on vec but keep all elements.

Before and after this optimization:

```
test vec::bench_retain_whole_100000                      ... bench:      84,803 ns/iter (+/- 17,314)
```

```
test vec::bench_retain_whole_100000                      ... bench:      42,638 ns/iter (+/- 16,910)
```

The result is expected, there are two `if`s before the optimization and one `if` after.
library/alloc/src/vec/mod.rs