मेरे पास बाइनरी फाइलों का एक बहुत बड़ा सेट है जहां वीडियो के कई हजार कच्चे फ्रेम अनुक्रमिक रूप से पढ़े और संसाधित किए जा रहे हैं, और अब मैं इसे अनुकूलित करने के लिए देख रहा हूं क्योंकि यह अधिक CPU- बाध्य है I/O-bound से.NET बाइनरी फ़ाइल पढ़ें प्रदर्शन
फ्रेम वर्तमान में इस तरह से पढ़ा जा रहा है, और मुझे लगता है यह सबसे बड़ी दोषी है:
private byte[] frameBuf;
BinaryReader binRead = new BinaryReader(FS);
// Initialize a new buffer of sizeof(frame)
frameBuf = new byte[VARIABLE_BUFFER_SIZE];
//Read sizeof(frame) bytes from the file
frameBuf = binRead.ReadBytes(VARIABLE_BUFFER_SIZE);
यह नेट के लिए से बचने के लिए मैं/हे फिर से संगठित में बहुत अधिक अंतर बना सकते हैं प्रत्येक फ्रेम के साथ इन सभी नए बाइट सरणी बनाना?
.NET की स्मृति आवंटन तंत्र की मेरी समझ कमजोर है क्योंकि मैं शुद्ध सी/सी ++ पृष्ठभूमि से आ रहा हूं। मेरा विचार है कि एक स्थिर बफर क्लास को साझा करने के लिए इसे फिर से लिखना है जिसमें फ्रेम के वास्तविक आकार को ट्रैक करने वाले पूर्णांक वाले एक बहुत बड़े साझा बफर शामिल हैं, लेकिन मुझे वर्तमान कार्यान्वयन की सादगी और पठनीयता से प्यार है और यदि इसे सीएलआर पहले से ही इसे किसी तरह से संभालता है, मुझे पता नहीं है।
किसी भी इनपुट की बहुत सराहना की जाएगी।
क्या आप यह सुनिश्चित करने के लिए एक प्रोफाइलर चलाते हैं कि प्रदर्शन हिट अन्य स्रोतों से नहीं आती है? या आप अभी गए और मान लिया "तो शायद यह है"? –
हाय डेविड, मैंने कुछ बार प्रदर्शन प्रोफाइलर चलाया और यह विशेष तरीका मेरा सबसे महंगा है। इसलिए मैं यह देखने के लिए देख रहा हूं कि यह "नया बाइट []" विधि .NET में एक स्पष्ट प्रदर्शन हत्यारा है या नहीं। एक सी प्रोग्रामर के रूप में, यह प्रत्येक बफर के लिए हजारों "मॉलोक" कथन के समान दिखता है, जो निश्चित रूप से फिर से उपयोग किए जाने वाले बफर से धीमा होगा। – rnd