Rust के लिए Criterion: उदाहरणों के साथ पूरी गाइड

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Criterion क्या है और इसकी आवश्यकता क्यों है?

Criterion.rs, Rust भाषा में बेंचमार्किंग (प्रदर्शन परीक्षण) के लिए एक शक्तिशाली और लचीली लाइब्रेरी है। यह Haskell के लिए लोकप्रिय Criterion लाइब्रेरी का सीधा विकल्प है, लेकिन इसे Rust इकोसिस्टम के लिए अनुकूलित किया गया है।

Criterion की आवश्यकता क्यों है? std::time::Instant के साथ साधारण समय मापने के विपरीत, Criterion प्रदान करता है:

  • सांख्यिकीय विश्लेषण: स्वचालित रूप से कोड को कई बार चलाता है, निष्पादन समय का नमूना एकत्र करता है, और माध्य, माध्यिका, मानक विचलन और प्रतिशतक की गणना करता है।
  • बेसलाइन से तुलना: वर्तमान कोड संस्करण के प्रदर्शन की तुलना पिछले संस्करण से करने की अनुमति देता है (रिग्रेशन टेस्टिंग)।
  • रिपोर्ट जनरेशन: ग्राफ़ और तालिकाओं के साथ सुंदर HTML रिपोर्ट बनाता है।
  • पैरामीट्रिक बेंचमार्किंग: विभिन्न इनपुट डेटा के साथ फ़ंक्शन के प्रदर्शन का आसानी से परीक्षण करें।
  • शोर से सुरक्षा: Criterion के एल्गोरिदम OS की पृष्ठभूमि प्रक्रियाओं के कारण होने वाले निष्पादन समय में उतार-चढ़ाव के प्रति प्रतिरोधी हैं।

यह लाइब्रेरी उन डेवलपर्स के लिए अपरिहार्य है जो:

  • महत्वपूर्ण कोड सेक्शन को ऑप्टिमाइज़ करना चाहते हैं।
  • यह सुनिश्चित करना चाहते हैं कि नया कोड पुराने फंक्शनैलिटी को धीमा न करे।
  • अनुमान के बजाय डेटा के आधार पर निर्णय लेना चाहते हैं।

Rust प्रोजेक्ट में Criterion की स्थापना

Python (pip) या Node.js (npm) के विपरीत, Rust में लाइब्रेरी की स्थापना Cargo पैकेज मैनेजर के माध्यम से होती है। Criterion मुख्य कोड के लिए लाइब्रेरी नहीं है, बल्कि परीक्षण के लिए एक उपकरण है, इसलिए इसे Cargo.toml फ़ाइल के [dev-dependencies] सेक्शन में जोड़ा जाता है।

आपको अपने प्रोजेक्ट की रूट डायरेक्टरी (src/ के साथ) में एक benches/ डायरेक्टरी भी बनानी होगी।

चरण 1: Cargo.toml में डिपेंडेंसी जोड़ें

[dev-dependencies]
criterion = { version = "0.5", features = ["html_reports"] }

नोट: features = ["html_reports"] फ़्लैग HTML रिपोर्ट जनरेशन को सक्षम करता है। इसके बिना केवल कंसोल पर टेक्स्ट आउटपुट होगा।

चरण 2: बेंचमार्क फ़ाइल बनाएँ

benches/my_benchmark.rs फ़ाइल बनाएँ (नाम कुछ भी हो सकता है)।

चरण 3: बेंचमार्क चलाएँ

cargo bench

यह कमांड आपके प्रोजेक्ट को रिलीज़ मोड (ऑप्टिमाइज़ेशन के साथ) में कंपाइल करेगा और benches/ फ़ोल्डर से सभी बेंचमार्क चलाएगा।

त्वरित शुरुआत: पहला बेंचमार्क

आइए एक सरल बेंचमार्क लिखें जो 0 से 99 तक संख्याओं के योग की गति को मापता है।

// benches/my_benchmark.rs
use criterion::{black_box, criterion_group, criterion_main, Criterion};

// वह फ़ंक्शन जिसका हम परीक्षण करेंगे
fn sum_slow(n: u64) -> u64 {
    let mut sum = 0;
    for i in 0..n {
        sum += i;
    }
    sum
}

fn sum_fast(n: u64) -> u64 {
    n * (n - 1) / 2
}

fn criterion_benchmark(c: &mut Criterion) {
    // बेंचमार्क को ग्रुप करें
    let mut group = c.benchmark_group("sum_comparison");
    
    group.bench_function("slow", |b| b.iter(|| sum_slow(black_box(100))));
    group.bench_function("fast", |b| b.iter(|| sum_fast(black_box(100))));
    
    group.finish();
}

// रजिस्ट्रेशन और रन के लिए मैक्रोज़
criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);

यहाँ क्या हो रहा है?

  • black_box() — कंपाइलर को बताता है कि वैल्यू को "जैसा है" वैसा ही पास किया जाना चाहिए, समय से पहले ऑप्टिमाइज़ेशन को रोकता है (कंपाइलर कंपाइल टाइम पर कॉन्स्टेंट की गणना कर सकता है, जो परिणाम को विकृत करेगा)।
  • b.iter() — बेंचमार्क का मुख्य लूप। Criterion इस क्लोज़र को कई बार कॉल करेगा और समय मापेगा।
  • criterion_group! और criterion_main! — मैक्रोज़ हैं जो बेंचमार्क को रजिस्टर और रन करते हैं।

अनुशंसाएँ