Si je cours ces points de référence à Rust:Pourquoi le logarithme est-il plus lent dans Rust que dans Java?
#[bench]
fn bench_rnd(b: &mut Bencher) {
let mut rng = rand::weak_rng();
b.iter(|| rng.gen_range::<f64>(2.0, 100.0));
}
#[bench]
fn bench_ln(b: &mut Bencher) {
let mut rng = rand::weak_rng();
b.iter(|| rng.gen_range::<f64>(2.0, 100.0).ln());
}
Le résultat est:
test tests::bench_ln ... bench: 121 ns/iter (+/- 2)
test tests::bench_rnd ... bench: 6 ns/iter (+/- 0)
121-6 = 115 ns par ln
appel.
Mais la même référence en Java:
@State(Scope.Benchmark)
public static class Rnd {
final double x = ThreadLocalRandom.current().nextDouble(2, 100);
}
@Benchmark
public double testLog(Rnd rnd) {
return Math.log(rnd.x);
}
me donne:
Benchmark Mode Cnt Score Error Units
Main.testLog avgt 20 31,555 ± 0,234 ns/op
Le journal est ~ 3,7 fois plus lent (115/31) à Rust qu'en Java.
Lorsque je teste l'implémentation de l'hypoténuse (hypot
), l'implémentation dans Rust est 15,8 fois plus rapide qu'en Java. Est-ce que j'ai écrit de mauvais repères ou est-ce un problème de performance?
Les réponses aux questions posées dans les commentaires:
"" est un séparateur décimal dans mon pays. Je lance le test de référence de Rust en utilisant
cargo bench
qui s'exécute toujours en mode release. La structure de référence Java (JMH) crée un nouvel objet pour chaque appel, même s'il s'agit d'une classestatic
et d'une variablefinal
. Si j'ajoute une création aléatoire dans la méthode testée, j'obtiens 43 ns/op.
Est-ce que java est mauvais à utiliser comme base de référence? Je veux dire que java est sympa mais dans certains cas, c'est trop beau – Wietlol
Vous êtes probablement en train d'évaluer le générateur de nombres aléatoires plus que la fonction log. Aussi, je crois que Rust utilise simplement la bibliothèque mathématique du système, donc un simple appel à 'log' devrait être le même que ce qu'il est en C (aucune idée sur Java). –
Pourriez-vous réexécuter le test en utilisant 'RUSTFLAGS = '- Ctarget-cpu =' banc de chargement 'natif? – kennytm