Poor codegen for u64::isqrt()
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Rust
- Estrellas
- 119k
- Forks
- 16.2k
- Métricas de merge de PR
- Métricas de PR pendientes
Descripción
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
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza compilando el ejemplo proporcionado de u64::isqrt() con la toolchain rustc 1.92.0 indicada y examinando las instrucciones generadas. Sigue la ruta de generación de código de rustc para esta operación y compara su salida y tiempo de ejecución con el enfoque propuesto en el issue; se considera terminado cuando las instrucciones excesivas y la ralentización se hayan resuelto con evidencias de un benchmark específico.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- rust
- Área
- compilers, performance
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 38/100