में कुशल स्ट्रिंग कार्यान्वयन मैं वर्तमान में हास्केल को पढ़ रहा हूं, और मैं सोच रहा हूं कि हास्केल में तारों के साथ काम करते समय सबसे अच्छा अभ्यास क्या होता है।हास्केल
हास्केल में डिफ़ॉल्ट स्ट्रिंग कार्यान्वयन चार की एक सूची है। Real World Haskell के अनुसार, यह फ़ाइल इनपुट-आउटपुट के लिए अक्षम है, क्योंकि प्रत्येक चरित्र को अलग से आवंटित किया जाता है (मुझे लगता है कि इसका मतलब है कि एक स्ट्रिंग मूल रूप से हास्केल में एक लिंक्ड सूची है, लेकिन मुझे यकीन नहीं है।)
लेकिन अगर डिफ़ॉल्ट स्ट्रिंग कार्यान्वयन फ़ाइल I/o के लिए अक्षम है, क्या यह स्मृति में स्ट्रिंग्स के साथ काम करने के लिए भी अक्षम है? क्यों या क्यों नहीं? सी स्ट्रिंग का प्रतिनिधित्व करने के लिए चार की एक सरणी का उपयोग करता है, और मुझे लगता है कि यह ज्यादातर भाषाओं में चीजों को करने का डिफ़ॉल्ट तरीका होगा।
जैसा कि मैंने इसे देखा है, स्ट्रिंग की सूची कार्यान्वयन अधिक मेमोरी लेगा, क्योंकि प्रत्येक चरित्र को ओवरहेड की आवश्यकता होगी, और इसके बाद भी अधिक समय लगाना होगा, क्योंकि अगले चार में जाने के लिए पॉइंटर ड्रेफ्रेंसिंग की आवश्यकता होगी। लेकिन मुझे अब तक हास्केल के साथ खेलना अच्छा लगा है, इसलिए मैं विश्वास करना चाहता हूं कि डिफ़ॉल्ट कार्यान्वयन कुशल है।
डिफ़ॉल्ट कार्यान्वयन, छोटे तारों और सामान्य परिचालनों के लिए काम करने के लिए सबसे सुविधाजनक है, जो उन पर प्रदर्शन करना चाहता है। बड़े तारों के लिए जिन्हें आप मूल रूप से बाइट्स के ब्लॉक के रूप में मानना चाहते हैं, यह कुशल नहीं है; Data.ByteString या Data.ByteString.Lazy – ShreevatsaR