2017-01-12 5 views
5

तेजी लाने के लिए मैं टैब द्वारा विभाजित मान को पार्स कर रहा हूँ:कैसे UTF-8 स्ट्रिंग प्रसंस्करण

pub fn parse_tsv(line: &str) -> MyType { 
    for (i, value) in line.split('\t').enumerate() { 
     // ... 
    } 
    // ... 
} 

perf शीर्ष str.find शामिल हैं। जब मैं जेनरेट किए गए असेंबली कोड में देखता हूं, तो &str में प्रतीकों के यूटीएफ -8 कोडिंग से संबंधित बहुत अधिक काम होता है।

और यह अपेक्षाकृत घोर धीमी है। निष्पादन समय में 99% लगते हैं।

लेकिन \t खोजने के लिए मैं बस एक यूटीएफ -8 स्ट्रिंग में एक-बाइट \t खोज नहीं सकता।

मैं क्या गलत कर रहा हूं? जंग Stdlib गलत क्या कर रहा है?

या शायद जंग में एक स्ट्रिंग लाइब्रेरी है जो 'u8' बाइट्स द्वारा स्ट्रिंग का प्रतिनिधित्व कर सकती है? लेकिन सभी split(), find(), और अन्य विधियों के साथ?

+1

आप पर अनुकूलन के साथ संकलन कर रहे हैं? ('--release' कार्गो के साथ) – huon

+0

@huon पाठ्यक्रम – vladon

+0

यदि आप '\ t" 'का उपयोग करते हैं तो गति अंतर क्या है? – Shepmaster

उत्तर

7

जब तक आपकी स्ट्रिंग ASCII है या आपको यूटीएफ -8 स्केलर्स (जैसे आपके मामले में, जहां आप टैब की खोज करते हैं) पर मिलान करने की आवश्यकता नहीं है, तो आप इसे as_bytes() विधि के साथ बाइट्स के रूप में देख सकते हैं और बाद में char एस (यूटीएफ -8 स्केलर्स) के बजाय u8 वर्ण (बाइट्स) पर काम करें। यह बहुत तेज होना चाहिए। &[u8] के साथ है, जो एक slice है, तब भी आप &str स्लाइस split(), find() तरह के लिए लागू तरीकों का उपयोग कर सकते हैं, आदि

let line = String::new(); 
let bytes = line.as_bytes(); 

pub fn parse_tsv(line: &[u8]) { 
    for (i, value) in line.split(|c| *c == b'\t').enumerate() { 

    } 
} 

fn main() { 
    let line = String::new(); 
    let bytes = line.as_bytes(); 

    parse_tsv(&bytes) 
} 
+0

वाह, मैं 'और [u8]' पर विभाजित का उपयोग कर सकता हूं, मुझे इसके बारे में पता नहीं था, धन्यवाद! – vladon

संबंधित मुद्दे