अगर मैं जंग में इन मील के पत्थरों चलाएँ:जावा में जंग की तुलना में जंग में लॉगरिदम धीमा क्यों है?
#[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());
}
परिणाम है:
प्रतिln
कॉल
test tests::bench_ln ... bench: 121 ns/iter (+/- 2)
test tests::bench_rnd ... bench: 6 ns/iter (+/- 0)
121-6 = 115 एनएस।
लेकिन जावा में एक ही बेंचमार्क:
@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);
}
मुझे देता है:
Benchmark Mode Cnt Score Error Units
Main.testLog avgt 20 31,555 ± 0,234 ns/op
लॉग है ~ 3.7 गुना धीमी जंग में (115/31) जावा की तुलना में।
जब मैं hypotenuse कार्यान्वयन (hypot
) का परीक्षण करता हूं, तो जंग में कार्यान्वयन जावा की तुलना में 15.8 गुना तेज है।
क्या मैंने खराब मानक लिखा है या यह एक प्रदर्शन मुद्दा है? टिप्पणी में पूछे गये सवालों के
जवाब:
"," मेरे देश में एक दशमलव विभाजक है।
मैं
cargo bench
का उपयोग कर जंग का बेंचमार्क चलाता हूं जो हमेशा रिलीज मोड में चलता है।जावा बेंचमार्क फ्रेमवर्क (जेएमएच) प्रत्येक कॉल के लिए एक नई वस्तु बनाता है, भले ही यह
static
वर्ग औरfinal
चर हो। यदि मैं परीक्षण विधि में एक यादृच्छिक निर्माण जोड़ता हूं, तो मुझे 43 एनएस/सेशन मिलता है।
क्या जावा बेंचमार्क आधार के रूप में उपयोग करने में बुरा नहीं है? मेरा मतलब है कि जावा अच्छा है लेकिन कुछ मामलों में, यह बहुत अच्छा है – Wietlol
आप लॉग फ़ंक्शन से अधिक यादृच्छिक संख्या जनरेटर को बेंचमार्क कर रहे हैं। साथ ही, मेरा मानना है कि जंग सिर्फ सिस्टम गणित पुस्तकालय का उपयोग करता है, इसलिए 'लॉग' के लिए एक शुद्ध कॉल सी में क्या होना चाहिए (जावा के बारे में कोई विचार नहीं)। –
क्या आप 'RUSTFLAGS =' - Ctarget-cpu = मूल 'कार्गो बेंच' का उपयोग करके परीक्षण को फिर से शुरू कर सकते हैं? – kennytm