इस मुद्दे के लिए एक फ़िक्स आज विलय कर दिया गया था। इसका मतलब है कि यह अगली रात का हिस्सा होना चाहिए, और जंग 1.3 में रिलीज होने की उम्मीद है। फिक्स ने Two-way substring search कार्यान्वयन को पुनर्जीवित किया कि जंग को मानक पुस्तकालय में नए Pattern API पर उपयोग और अनुकूलित किया गया था।
दो-तरफा एल्गोरिदम रस्ट के लिबकोर के लिए एक अच्छा मैच है क्योंकि यह एक रैखिक समय है जो खोज एल्गोरिदम है जो ओ (1) स्पेस का उपयोग करता है और उसे गतिशील आवंटन की आवश्यकता नहीं होती है।
विशेष कार्यान्वयन में एक साधारण जोड़ शामिल है जो इस विशेष प्रश्न को अत्यंत जल्दी से अस्वीकार कर देगा (और नहीं, यह इस प्रश्न के कारण लिखा नहीं गया था, यह पुराने कोड का भी हिस्सा था)।
सेटअप के दौरान खोजकर्ता सुई के लिए फिंगरप्रिंट का एक प्रकार की गणना करता है: सुई में प्रत्येक बाइट के लिए, अपनी कम 6 बिट है, जो एक संख्या 0-63 है लेते हैं, तो u64
चर byteset
में इसी बिट निर्धारित किया है।
let byteset = needle.iter().fold(0, |a, &b| (1 << ((b & 0x3f) as usize)) | a);
के बाद सुई केवल 'बी का होता है, byteset का मूल्य केवल 34 वीं बिट सेट (98 & 63 == 34
) होगा।
अब हम किसी भी बाइट का परीक्षण कर सकते हैं चाहे वह सुई का हिस्सा हो या नहीं। यदि इसका संबंधित बिट byteset
में सेट नहीं है, तो सुई मेल नहीं खा सकती है। प्रत्येक मामले में हम इस मामले में घास के मैदान में परीक्षण करेंगे 'ए' (97 & 63 == 33
), और यह मेल नहीं खा सकता है। तो एल्गोरिदम एक बाइट पढ़ेगा, इसे अस्वीकार कर देगा, और फिर सुई की लंबाई को छोड़ देगा।
fn byteset_contains(&self, byte: u8) -> bool {
(self.byteset >> ((byte & 0x3f) as usize)) & 1 != 0
}
// Quickly skip by large portions unrelated to our substring
if !self.byteset_contains(haystack[self.position + needle.len() - 1]) {
self.position += needle.len();
continue 'search;
}
From libcore/str/pattern.rs
in rust-lang/rust
जो लोग आश्चर्य के लिए: इस मामले में, यह एक अनुकूलन मुद्दा नहीं है। यहां तक कि जंग संस्करण पर ऑप्टिमाइज़ेशन के साथ भी चलने के लिए बहुत लंबा है। – Levans
मैं * सोचता हूं * यह हो सकता है कि स्ट्रिंग के लिए 'शामिल' यूटीएफ -8 को सही तरीके से संभालने के लिए अतिरिक्त क्रियाएं करता है, हालांकि, जब मैं नियमित स्लाइस के लिए 'शामिल' की गति की जांच करने गया, तो मुझे पता चला कि जंग में एक भी नहीं है o_O। मेरा बेवकूफ कार्यान्वयन अभी भी बहुत धीमा था। –
यह मेरे लिए प्रयास किया; रुबी ने 5 एस लिया, जंग ने * 7 मिनट * लिया। जंग के कार्यान्वयन के माध्यम से एक त्वरित squiz (देखें ['libcore/str/pattern.rs'] (https://github.com/rust-lang/rust/blob/1.0.0/src/libcore/str/pattern.rs# एल 3 9 0)) यह रस्ट के खोजकर्ता की तरह दिखता है * पूरी तरह से बेवकूफ़ *। यदि रूबी कार्यान्वयन कुछ भी दूरस्थ रूप से चालाक कर रहा है, तो यह आश्चर्य की बात नहीं है कि जंग इतनी धीमी है। किसी भी तरह से, दायर किए गए प्रदर्शन मुद्दे के योग्य दिखता है। –