Poor codegen for u64::isqrt()
Personne n'a encore pris cette issue.
- Langage dominant
- Rust
- Étoiles
- 119k
- Forks
- 16.2k
- Métriques de merge des PR
- Métriques de PR en attente
Description
I tried this code:
fn isqrt(val:u64)->u64{
val.isqrt()
}
I expected to see this happen: rustc generates reasonable code.
Instead, this happened: rustc generates ~150 too many instructions, which takes a while to run.
Potential fix: Use this implementation instead:
fn isqrt(val:u64)->u64{
let estimate = (val as f64).sqrt() as u64;
if val < (1<< 52){//value fits in mantissa, exact precision.
return estimate;
}else{
// Otherwise, do a newton-raphson iteration for the final bits of precision
unsafe{assert_unchecked(estimate!=0);};
return (estimate + val/estimate)/2;
}
}
On my machine, it ran twice as fast.
Meta
rustc --version --verbose:
rustc 1.92.0 (ded5c06cf 2025-12-08)
binary: rustc
commit-hash: ded5c06cf21d2b93bffd5d884aa6e96934ee4234
commit-date: 2025-12-08
host: x86_64-pc-windows-msvc
release: 1.92.0
LLVM version: 21.1.3
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez par compiler l’exemple fourni de u64::isqrt() avec la toolchain rustc 1.92.0 indiquée et inspectez les instructions générées. Suivez le chemin de génération de code de rustc pour cette opération et comparez sa sortie et son temps d’exécution avec l’approche proposée dans l’issue ; le travail est considéré comme terminé lorsque les instructions superflues et le ralentissement sont corrigés, avec des éléments probants issus d’un benchmark ciblé.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- rust
- Domaine
- compilers, performance
- Type d'issue
- Bug
- Difficulté
- 4/5
- Temps estimé
- 3-5 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 38/100