2010-03-04 12 views
7

मैं सिमुलेशन कोड चला रहा हूं जो काफी हद तक सीपीयू की गति से बंधे हैं। मुझे उपयोगकर्ता इंटरफ़ेस में डेटा को आउट/आउट करने में कोई दिलचस्पी नहीं है, बस इसकी गणना के रूप में इसे डिस्क पर सहेजना।सी ++ में डिस्क पर डेटा आउटपुट करने का सबसे तेज़ तरीका क्या है?

उपरांत को कम करने वाला सबसे तेज़ समाधान क्या होगा? iostreams? printf? मैंने पहले पढ़ा है कि printf तेज है। क्या यह मेरे कोड पर निर्भर करेगा और क्या प्रोफाइलिंग के बिना जवाब प्राप्त करना असंभव है?

यह विंडोज़ में चल रहा है और आउटपुट डेटा को ज्यादातर प्रारूपित बिंदु मानों के लिए स्वरूपण/सटीक विकल्पों के साथ पाठ प्रारूप, टैब/अल्पविराम से अलग होना चाहिए।

+2

प्रोफाइलिंग में क्या गलत है? या आपके मामले में, बस समय? –

+0

कुछ भी नहीं, शुरुआती बिंदु की आवश्यकता के अलावा। –

+3

डिस्क आईओ को अधिकतम करने में शामिल सूक्ष्मता का एक बड़ा हिस्सा, संभवतः प्रोफाइलिंग करने वाले लोगों से कुछ कागजात पढ़ने के लिए बेहतर है। –

उत्तर

3

मेरा विचार यह है कि आप गलत समस्या का सामना कर रहे हैं। आप बड़ी मात्रा में टेक्स्ट स्वरूपित डेटा क्यों लिख रहे हैं?यदि ऐसा इसलिए है क्योंकि आप इसे मानव पठनीय होना चाहते हैं, तो फ्लाई पर बाइनरी प्रारूप में डेटा पढ़ने के लिए एक त्वरित ब्राउज़र प्रोग्राम लिखना - इस तरह सिमुलेशन एप्लिकेशन जल्दी से बाइनरी डेटा लिख ​​सकता है और ब्राउजर स्वरूपण के गंदे काम कर सकता है डेटा के रूप में और जब आवश्यक हो। यदि ऐसा इसलिए है क्योंकि आप टेक्स्ट डेटा को पढ़ने और विश्लेषण करने के लिए कुछ आंकड़े पैकेज का उपयोग कर रहे हैं तो बाइनरी डेटा इनपुट करने वाले व्यक्ति को लिखें।

4

मैंने उन्हें स्वयं का उपयोग नहीं किया है, लेकिन मैंने सुना है कि मेमोरी मैप की गई फ़ाइलें ओएस को सर्वोत्तम अनुकूलन अवसर प्रदान करती हैं।

संपादित करें: संबंधित question, और Wikipedia article on memory mapped files - दोनों प्रदर्शन लाभ का उल्लेख करते हैं।

+0

बहुत बुरा कोई पोषक तरीका नहीं है :(+1 –

4

डेटा का निर्माण (बड़े-आश) ब्लॉक जो अनुक्रमिक रूप से लिखे जा सकते हैं और एसिंक्रोनस आईओ का उपयोग कर सकते हैं।

सटीक प्रोफाइलिंग दर्दनाक होगा, इस विषय पर कुछ कागजात पढ़ें: scholar.google.com

0

सबसे तेज़ तरीका समापन-आधारित असीमित आईओ है।

ओएस को लिखने के लिए डेटा का एक सेट देकर, जिसे वास्तव में कॉल रिटर्न के दौरान लिखा नहीं गया है, ओएस इसे लिखने के प्रदर्शन को अनुकूलित करने के लिए पुन: व्यवस्थित कर सकता है।

ऐसा करने के लिए एपीआई ओएस विशिष्ट है: लिनक्स पर, इसे AIO कहा जाता है; विंडोज़ पर इसे Completion Ports कहा जाता है।

1

फ़ाइल को बाइनरी मोड में खोलें, और डिस्क पर "अनफॉर्मेटेड" डेटा लिखें।

fstream myFile; 
... 
myFile.open ("mydata.bin", ios:: in | ios::out | ios::binary); 
... 
class Data { 
    int  key; 
    double value; 
    char[10] desc; 
}; 

Data x; 

myFile.seekp (location1); 
myFile.write ((char*)&x, sizeof (Data)); 

संपादित करें: ओपी ने कहा "आउटपुट डेटा टेक्स्ट प्रारूप में होना चाहिए, चाहे टैब या अल्पविराम अलग हो।" बाधा।

यदि आपका एप्लिकेशन सीपीयू बाध्य है, तो आउटपुट का स्वरूपण एक ओवरहेड है जिसकी आपको आवश्यकता नहीं है। बाइनरी डेटा एसीआईआई से लिखने और पढ़ने के लिए बहुत तेज़ है, डिस्क पर छोटा है (उदाहरण के लिए एसीआईआई की तुलना में द्विआधारी के साथ लिखे गए कुल बाइट्स हैं), और क्योंकि यह छोटा है, नेटवर्क के चारों ओर स्थानांतरित करना तेज़ है (नेटवर्क घुड़सवार समेत फाइल सिस्टम)। सभी संकेतक बाइनरी को एक अच्छा समग्र अनुकूलन के रूप में इंगित करते हैं।

बाइनरी डेटा देखना एक साधारण उपयोगिता के साथ चलाने के बाद किया जा सकता है जो डेटा को किसी भी प्रारूप में एसीआईआई को डंप करेगा। मैं कुछ संस्करण जानकारी को परिणामी द्विआधारी डेटा में जोड़ा जाएगा ताकि यह सुनिश्चित किया जा सके कि डेटा के प्रारूप में परिवर्तन डंप उपयोगिता में संभाला जा सके।

बाइनरी से एएससीआई तक चलना, और उसके बाद printf बनाम iostreams के सापेक्ष प्रदर्शन पर quibbling संभवतः आपके समय का सबसे अच्छा उपयोग नहीं है।

3

स्कॉट मेयर्स 'अधिक प्रभावी सी ++ बिंदु 23 "वैकल्पिक पुस्तकालयों पर विचार करें" यदि आप सुरक्षा और विस्तारशीलता पर गति पसंद करते हैं तो iostream पर stdio का उपयोग करने का सुझाव देते हैं। यह जांच के लायक है।

2

सबसे तेज़ तरीका यह है कि आपके विशिष्ट एप्लिकेशन के लिए अपने सामान्य लक्ष्य ओएस और हार्डवेयर पर चलने वाला सबसे तेज़ तरीका है। ऐसा करने के लिए एकमात्र समझदार बात यह है कि कई दृष्टिकोणों का प्रयास करें और उन्हें समय दें। आपको शायद एक पूर्ण प्रोफ़ाइल की आवश्यकता नहीं है, और अभ्यास केवल कुछ घंटों लेना चाहिए। मैं इस क्रम में परीक्षण होगा,:

  • सामान्य सी ++ धारा आई/ओ
  • सामान्य धारा आई/ओ ostream :: लिखने()
  • सीआई/ओ लाइब्रेरी के
  • उपयोग के उपयोग का उपयोग कर प्रणाली लिखने के रूप में इस तरह के कॉल()
  • asynch आई/ओ

और मैं बंद कर देंगे जब मैं एक समाधान है कि काफी तेजी से था पाया।

2

टेक्स्ट प्रारूप का अर्थ है कि यह मानव उपभोग के लिए है। जिस गति पर मनुष्य पढ़ सकते हैं वह किसी भी उचित आउटपुट विधि की गति से बहुत कम है। कहीं एक विरोधाभास है। मुझे संदेह है कि "आउटपुट टेक्स्ट प्रारूप होना चाहिए"।

इसलिए, मैं द्विआधारी उत्पादन करने के लिए सही था, और अलग-अलग प्रविष्टियों को पठनीय पाठ में परिवर्तित करने के लिए एक अलग दर्शक प्रदान करता हूं। दर्शकों में स्वरूपण केवल उतना तेज़ होना चाहिए जितना लोग पढ़ सकते हैं।

0

डबल बफरिंग और एकाधिक धागे (कम से कम दो) का उपयोग करने के लिए एक तेज विधि है।

एक धागा हार्ड ड्राइव पर डेटा लिखने का प्रभारी है। यह कार्य बफर की जांच करता है और यदि खाली नहीं है (या शायद एक और नियम) हार्ड ड्राइव पर लिखना शुरू करता है।

अन्य धागा बफर को स्वरूपित पाठ लिखता है।

हार्ड ड्राइव के साथ एक प्रदर्शन समस्या गति तक पहुंचने और सिर को सही स्थान पर रखने के लिए आवश्यक समय की मात्रा है। ऐसा होने से बचने के लिए, उद्देश्य हार्ड ड्राइव को लगातार लिखना है ताकि यह रुक न सके। यह मुश्किल है और इसमें आपके प्रोग्राम के दायरे से बाहर सामान शामिल हो सकता है (जैसे कि एक ही समय में चल रहे अन्य प्रोग्राम)। हार्ड ड्राइव पर लिखे गए डेटा का बड़ा हिस्सा, बेहतर।

एक और कांटा डेटा डालने के लिए हार्ड ड्राइव पर खाली स्लॉट ढूंढ रहा है। एक खंडित हार्ड ड्राइव स्वरूपित या डिफ्रैग्मेंटेड ड्राइव की तुलना में धीमी होगी।

यदि पोर्टेबिलिटी कोई मुद्दा नहीं है, तो आप हार्ड ड्राइव पर ब्लॉक लिखने वाले कुछ एपीआई के लिए अपना ओएस देख सकते हैं। या आप नीचे जा सकते हैं और एपीआई का उपयोग कर सकते हैं जो सीधे ड्राइव पर लिखता है।

आप यह भी चाहते हैं कि आपका प्रोग्राम इसकी प्राथमिकता को बदल सके ताकि यह चलने वाले सबसे महत्वपूर्ण कार्यों में से एक हो।

+1

मुझे यकीन नहीं है कि आईओ के लिए धागे जोड़ना सही कदम है। मुख्य कम्प्यूटेशनल लूप सीपीयू बाध्य है। यदि मशीन बहु-कोर है, तो बेहतर समग्र अनुकूलन होने की संभावना है कोड के कम्प्यूटेशनल भाग में समांतरता जोड़ने के लिए। यदि मशीन मल्टी-कोर नहीं है, तो आईओ के लिए थ्रेड जोड़ना जब मुख्य लूप पहले से ही सीपीयू बाउंड है, तो एप्लिकेशन के समग्र थ्रूपुट में वृद्धि नहीं हो सकती है। –

1

फ़ाइल को स्मृति में मैप करना (यानी Memory Mapped File का उपयोग करके) तो memcopy-डेटा डेटा पढ़ने/लिखने का एक तेज़ तरीका है।

आप डेटा को लिखने के लिए कई धागे/कोर का उपयोग कर सकते हैं, और ओएस/कर्नेल वर्चुअल मेमोरी के लिए उपयोग की जाने वाली उसी तरह की दिनचर्या का उपयोग करके पृष्ठों को डिस्क में सिंक करेगा, जिसे कोई नरक में अनुकूलित करने की उम्मीद कर सकता है और वापस, अधिक या कम।

मुख्य रूप से, ऐसा करने पर स्मृति में कुछ अतिरिक्त प्रतियां/बफर होना चाहिए। लिखने को इंटरप्ट द्वारा पकड़ा जाता है और एक पृष्ठ लिखा जाने के बाद डिस्क कतार में जोड़ा जाता है।

+0

यह एक प्रदान नहीं करता है प्रश्न का उत्तर दें। लेखक से स्पष्टीकरण की आलोचना करने या अनुरोध करने के लिए, उनके पद के नीचे एक टिप्पणी छोड़ दें। –

+1

@Jav_Rock: उत्तर दोबारा जवाब दें, उम्मीद है कि अब बेहतर है। – Macke

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

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