rust-lang / rust-lang/rust

Poor codegen for u64::isqrt()

Ouverte
#150,653 2 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

I-slow T-libs
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

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. 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

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.