2012-01-18 6 views
20

क्या कोई भी Data.Text और Data.ByteString.Char8 डेटा प्रकारों का उपयोग करने के लिए पेशेवरों और विपक्ष को समझा सकता है? क्या ASCII-only टेक्स्ट के साथ काम करना इन पेशेवरों और विपक्ष को बदलता है? क्या उनके आलसी रूपों ने कहानी भी बदल दी है?डेटा। टेक्स्ट बनाम डेटा.बेटस्ट्रिंग। चेर 8

उत्तर

28

Data.ByteString.Char8, 8-बिट ASCII वर्ण के दृश्यों के रूप में ByteString मूल्यों के इलाज के लिए कार्य प्रदान करता है, जबकि Data.Text एक स्वतंत्र प्रकार यूनिकोड की सम्पूर्णता का समर्थन है।

ByteString और Text अनिवार्य रूप से वही हैं, जहां तक ​​प्रतिनिधित्व होता है - सख्त हिस्सों की सूचियों के आधार पर आलसी रूपों के साथ सख्त, अनबॉक्स किए गए सरणी। मुख्य अंतर यह है कि ByteString स्टोर ऑक्टेट्स (यानी Word8 एस), जबकि Text स्टोर Char एस, यूटीएफ -16 में एन्कोड किया गया है।

यदि आप ASCII-only टेक्स्ट के साथ काम कर रहे हैं, तो Data.ByteString.Char8 का उपयोग Text से अधिक तेज़ होगा, और कम स्मृति का उपयोग करें; हालांकि, आपको खुद से पूछना चाहिए कि क्या आप वास्तव में सुनिश्चित हैं कि आप केवल ASCII के साथ काम करने जा रहे हैं। असल में, 99% मामलों में Data.ByteString.Char8Text से अधिक गति हैक - ऑक्टेट्स वर्ण नहीं हैं, और कोई भी हास्केलर इस बात से सहमत हो सकता है कि सही प्रकार का उपयोग कच्चे, नंगे धातु की गति पर प्राथमिकता दी जानी चाहिए। आपको आमतौर पर केवल इस पर विचार करना चाहिए यदि आपने प्रोग्राम का प्रोफाइल किया है और यह एक बाधा है। Text अच्छी तरह से अनुकूलित है, और अंतर ज्यादातर मामलों में शायद नगण्य होगा।

बेशक, गैर-गति से संबंधित स्थितियां हैं जिनमें Data.ByteString.Char8 जरूरी है। डेटा वाली फ़ाइल पर विचार करें जो अनिवार्य रूप से बाइनरी है, पाठ नहीं, लेकिन रेखाओं में विभाजित है; lines का उपयोग कर पूरी तरह से उचित है। इसके अतिरिक्त, यह पूरी तरह से कल्पना योग्य है कि एक पूर्णांक को बाइनरी प्रारूप के संदर्भ में ASCII दशमलव में एन्कोड किया जा सकता है; readInt का उपयोग करके उस मामले में सही अर्थ होगा।

तो, मूल रूप से:

  1. Data.ByteString.Char8: जहां प्रदर्शन सर्वोपरि है, और "लगभग-बाइनरी" डेटा कुछ ASCII घटक हैं कि संभाल करने के लिए शुद्ध ASCII स्थितियों के लिए।
  2. Data.Text: सहित स्थिति जहां टेक्स्ट एएससीआईआई के अलावा किसी अन्य चीज की थोड़ी सी संभावना है।
+0

मैं गारंटी दे सकता हूं कि केवल ASCII-केवल पाठ होगा, क्योंकि मेरा प्रोग्राम बहुत विशिष्ट कंप्यूटर जेनरेट की गई सी फाइलों को संसाधित करता है। मैं किसी भी मामले में दोनों कोशिश करूँगा। –

+0

मैं शायद 'Data.ByteString.Char8' के लिए जाऊंगा, क्योंकि आप अनिवार्य रूप से एक बाइनरी प्रारूप से निपटेंगे जो केवल * पाठ जैसा दिखता है। (मैं फ़ाइलों को पार्स करने के लिए [attoparsec] (http://hackage.haskell.org/package/attoparsec) की जांच करने की भी सिफारिश करता हूं।) – ehird

+0

आप यह भी उल्लेख करते हैं कि यूटीएफ -16 के रूप में टेक्स्ट एन्कोड और ऑक्टेट के रूप में बाइटस्ट्रिंग। क्या यह सामान्य रूप से स्मृति उपयोग को प्रभावित करता है? मेरा आवेदन एक कोड पुनरावर्तक है, और जैसा कि यह है, यह स्मृति की भारी मात्रा का उपयोग करता है जिसे मैं स्ट्रिंग का उपयोग करने के लिए पता लगा सकता हूं। मैं पहले से ही अपने तारों को प्रशिक्षित करता हूं, इसलिए किसी भी सुधार का स्वागत किया जाएगा। यही कारण है कि मैं डेटा प्रकार बदलना चाहता हूँ। –

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