Skip to content

Commit 4997545

Browse files
committed
Auto merge of #141652 - compiler-errors:more-collect-and-apply, r=<try>
[PERF] More collect and apply I saw that we have quite a few `collect_and_apply` calls for N=3-7 (N=7 corresponding to cumulative 99% of nalgebra's calls). Didn't perf locally, but also this is super low-pri, so let's see what rust-timer says.
2 parents ec28ae9 + 8180ed0 commit 4997545

File tree

1 file changed

+82
-23
lines changed

1 file changed

+82
-23
lines changed

compiler/rustc_type_ir/src/interner.rs

Lines changed: 82 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -381,29 +381,43 @@ impl<T, R> CollectAndApply<T, R> for T {
381381
I: Iterator<Item = T>,
382382
F: FnOnce(&[T]) -> R,
383383
{
384-
// This code is hot enough that it's worth specializing for the most
385-
// common length lists, to avoid the overhead of `SmallVec` creation.
386-
// Lengths 0, 1, and 2 typically account for ~95% of cases. If
387-
// `size_hint` is incorrect a panic will occur via an `unwrap` or an
388-
// `assert`.
389-
match iter.size_hint() {
390-
(0, Some(0)) => {
391-
assert!(iter.next().is_none());
392-
f(&[])
393-
}
394-
(1, Some(1)) => {
395-
let t0 = iter.next().unwrap();
396-
assert!(iter.next().is_none());
397-
f(&[t0])
398-
}
399-
(2, Some(2)) => {
400-
let t0 = iter.next().unwrap();
401-
let t1 = iter.next().unwrap();
402-
assert!(iter.next().is_none());
403-
f(&[t0, t1])
404-
}
405-
_ => f(&iter.collect::<SmallVec<[_; 8]>>()),
406-
}
384+
let Some(t0) = iter.next() else {
385+
return f(&[]);
386+
};
387+
388+
let Some(t1) = iter.next() else {
389+
return f(&[t0]);
390+
};
391+
392+
let Some(t2) = iter.next() else {
393+
return f(&[t1]);
394+
};
395+
396+
let Some(t3) = iter.next() else {
397+
return f(&[t1, t2]);
398+
};
399+
400+
let Some(t4) = iter.next() else {
401+
return f(&[t1, t2, t3]);
402+
};
403+
404+
let Some(t5) = iter.next() else {
405+
return f(&[t1, t2, t3, t4]);
406+
};
407+
408+
let Some(t6) = iter.next() else {
409+
return f(&[t1, t2, t3, t4, t5]);
410+
};
411+
412+
let Some(t7) = iter.next() else {
413+
return f(&[t1, t2, t3, t4, t5, t6]);
414+
};
415+
416+
let Some(t8) = iter.next() else {
417+
return f(&[t1, t2, t3, t4, t5, t6, t7]);
418+
};
419+
420+
f(&[t1, t2, t3, t4, t5, t6, t7, t8].into_iter().chain(iter).collect::<Vec<_>>())
407421
}
408422
}
409423

@@ -440,6 +454,51 @@ impl<T, R, E> CollectAndApply<T, R> for Result<T, E> {
440454
assert!(iter.next().is_none());
441455
f(&[t0, t1])
442456
}
457+
(3, Some(3)) => {
458+
let t0 = iter.next().unwrap()?;
459+
let t1 = iter.next().unwrap()?;
460+
let t2 = iter.next().unwrap()?;
461+
assert!(iter.next().is_none());
462+
f(&[t0, t1, t2])
463+
}
464+
(4, Some(4)) => {
465+
let t0 = iter.next().unwrap()?;
466+
let t1 = iter.next().unwrap()?;
467+
let t2 = iter.next().unwrap()?;
468+
let t3 = iter.next().unwrap()?;
469+
assert!(iter.next().is_none());
470+
f(&[t0, t1, t2, t3])
471+
}
472+
(5, Some(5)) => {
473+
let t0 = iter.next().unwrap()?;
474+
let t1 = iter.next().unwrap()?;
475+
let t2 = iter.next().unwrap()?;
476+
let t3 = iter.next().unwrap()?;
477+
let t4 = iter.next().unwrap()?;
478+
assert!(iter.next().is_none());
479+
f(&[t0, t1, t2, t3, t4])
480+
}
481+
(6, Some(6)) => {
482+
let t0 = iter.next().unwrap()?;
483+
let t1 = iter.next().unwrap()?;
484+
let t2 = iter.next().unwrap()?;
485+
let t3 = iter.next().unwrap()?;
486+
let t4 = iter.next().unwrap()?;
487+
let t5 = iter.next().unwrap()?;
488+
assert!(iter.next().is_none());
489+
f(&[t0, t1, t2, t3, t4, t5])
490+
}
491+
(7, Some(7)) => {
492+
let t0 = iter.next().unwrap()?;
493+
let t1 = iter.next().unwrap()?;
494+
let t2 = iter.next().unwrap()?;
495+
let t3 = iter.next().unwrap()?;
496+
let t4 = iter.next().unwrap()?;
497+
let t5 = iter.next().unwrap()?;
498+
let t6 = iter.next().unwrap()?;
499+
assert!(iter.next().is_none());
500+
f(&[t0, t1, t2, t3, t4, t5, t6])
501+
}
443502
_ => f(&iter.collect::<Result<SmallVec<[_; 8]>, _>>()?),
444503
})
445504
}

0 commit comments

Comments
 (0)