HeadlinesBriefing favicon HeadlinesBriefing.com

मैचिंग पज़ल स्ट्रीक्स और निराशाजनक बेंचमार्क

Hacker News •
×

मैचिंग पज़ल स्ट्रीक्स और निराशाजनक बेंचमार्क20 मार्च 2026 मैंने हाल ही में कोड का एक टुकड़ा लिखा जो कुछ टेक्स्ट को सॉर्ट करने के लिए .to_lowercase() का उपयोग करता था। यह थोड़ा मेमोरी का उपयोग करता है। हमेशा, कोड ने .sort_by_cached_key का उपयोग किया, जो बहुत चालाक है। लेकिन मैं सोचा कि .to_lowercase() को log(n) बार करना n बार करने से अधिक धीमा होगा, क्योंकि कई स्ट्रिंग्स में, भले ही पहले कुछ अक्षर भी अलग हों। पहले, Rust में दो &strs का केस-इन्सेंसिटिव कम्पेर करना संभव है, यदि थोड़ा कॉन्लेक्स है। यहाँ का समाधान यह है कि सभी chars पर इटरेट करना, फिर char::to_lowercase को कॉल करना, जो कि कई chars के लिए लोवरकेस में कई chars के साथ एक अन्य chars इटरेटर देता है, जिसे हम flat_map कर सकते हैं। दूसरा पज़ल का टुकड़ा यह है कि Iterator एक cmp मेथड रखता है लेकिन Ord नहीं लागू करता क्योंकि यह आइडेंम्पोटेंट नहीं है: अगर आप cmp कॉल करते हैं तो आप इटरेटर को खत्म कर देते हैं। फिर भी sort_by के साथ, हम लोवरकेस कनवर्ज़न और कम्पेरेशन को इंटरलीव कर सकते हैं। ठीक ही गर्मी के लिए, मैंने unicase crate को भी बेंचमार्क में जोड़ दिया। जैसे ही मैं एक ऐसा जिज़्ञासु शख्स हूँ, मैंने स्वाभाविक रूप से एक बेंचमार्क लिखा, जो यहाँ पर पुनर्निर्माण करने के लिए पर्याप्त छोटा है (अगर आप निष्कर्ष में रुकना नहीं चाहते तो नीचे SCROLL करें):use fake::faker::name::raw:: Name;use fake::{locales:: EN, Fake};fn setup(num: usize) -> Vec<String> {(0..num).map(|_| Name(EN).fake()).collect::<Vec<String>>()}#[divan::bench(args = [1, 5, 10, 100, 1000, 10000])]fn sort_by_cached_lowercase(bencher: divan:: Bencher, size: usize) {let names = setup(size);bencher.counter(size).bench_local(|| {let mut sorted = names.clone();sorted.sort_by_cached_key(|name| name.to_lowercase());sorted})}#[divan::bench(args = [1, 5, 10, 100, 1000, 10000])]fn sort_by_iter_lowercase(bencher: divan:: Bencher, size: usize) {let names = setup(size);bencher.counter(size).bench_local(|| {let mut sorted = names.clone();fn caseless(s: &String) -> impl Iterator<Item = char> + '_ {s.chars().flat_map(char::to_lowercase)}sorted.sort_by(|s1, s2| caseless(s1).cmp(caseless(s2)));sorted})}#[divan::bench(args = [1, 5, 10, 100, 1000, 10000])]fn sort_by_unicase(bencher: divan:: Bencher, size: usize) {let names = setup(size);bencher.counter(size).bench_local(|| {let mut sorted = names.clone();sorted.sort_by(|s1, s2| unicase:: Uni Case::new(s1).cmp(&unicase:: Uni Case::new(s2)));sorted})}fn main() {// पंजीकृत बेंचमार्क चलाएं।divan::main();}मेरे M2-MAX Mac Book Pro पर परिणाम: टाइमर सटीकता: 41 nslow fastest │ slowest │ median │ mean │ samples │ iters├─ sort_by_cached_lowercase │ │ │ │ ││ ├─ 1 16.68 ns │ 18.14 ns │ 17.49 ns │ 17.49 ns │ 100 │ 25600│ │ 59.94 Mitem/s │ 55.1 Mitem/s │ 57.15 Mitem/s │ 57.15 Mitem/s │ ││ ├─ 5 212.9 ns │ 265 ns │ 215.5 ns │ 219.2 ns │ 100 │ 3200│ │ 23.47 Mitem/s │ 18.86 Mitem/s │ 23.19 Mitem/s │ 22.8 Mitem/s │ ││ ├─ 10 452.5 ns │ 567.1 ns │ 457.7 ns │ 462.2 ns │ 100 │ 1600│ │ 22.09 Mitem/s │ 17.63 Mitem/s │ 21.84 Mitem/s │ 21.63 Mitem/s │ ││ ├─ 100 5.207 µs │ 11.33 µs │ 5.291 µs │ 5.455 µs │ 100 │ 100│ │ 19.2 Mitem/s │ 8.824 Mitem/s │ 18.89 Mitem/s │ 18.32 Mitem/s │ ││ ├─ 1000 73.62 µs │ 110.9 µs │ 75.99 µs │ 78.89 µs │ 100 │ 100│ │ 13.58 Mitem/s │ 9.009 Mitem/s │ 13.15 Mitem/s │ 12.67 Mitem/s │ │⎯ 10000 853.7 µs │ 1.053 ms │ 864.8 µs │ 886.3 µs │ 100 │ 100│ 11.71 Mitem/s │ 9.495 Mitem/s │ 11.56 Mitem/s │ 11.28 Mitem/s │ ├─ sort_by_iter_lowercase │ │ │ │ ││ ├─ 1 13.91 ns │ 23.35 ns │ 14.89 ns │ 15.68 ns │ 100 │ 25600│ │ 71.87 Mitem/s │ 42.81 Mitem/s │ 67.15 Mitem/s │ 63.76 Mitem/s │ ││ ├─ 5 134.8 ns │ 196 ns │ 137.4 ns │ 148.6 ns │ 100 │ 3200│ │ 37.08 Mitem/s │ 25.5 Mitem/s │ 36.37 Mitem/s │ 33.64 Mitem/s │ ││ ├─ 10 442.1 ns │ 1.03 µs │ 483.8 ns │ 519.1 ns │ 100 │ 800│ │ 22.61 Mitem/s │ 9.702 Mitem/s │ 20.66 Mitem/s │ 19.26 Mitem/s │ ││ ├─ 100 17.33 µs │ 34.12 µs │ 18.16 µs │ 19.66 µs │ 100 │ 100│ │ 5.769 Mitem/s │ 2.93 Mitem/s │ 5.504 Mitem/s │ 5.086 Mitem/s │ ││ ├─ 1000 337.6 µs │ 433 µs │ 352.1 µs │ 355.4 µs │ 100 │ 100│ │ 2.961 Mitem/s │ 2.309 Mitem/s │ 2...