अनुवर्ती: VB.NET: एक नई बाइट सरणी लौटाएं जिसमें â3â बाइट्स और छोड़े गए बाइट्स की संख्या शामिल नहीं है
मैंने एक VB.NET फ़ंक्शन लिखा है जो इनपुट के रूप में एक बाइट सरणी, एक प्रारंभिक स्थिति (बिट्स में) और कई बिट्स लेता है। लक्ष्य खोजी जा रही निर्दिष्ट सीमा से 3 की किसी भी घटना को हटाना है। फ़ंक्शन को निर्दिष्ट लंबाई और कितने बाइट छोड़े गए थे, इसकी जानकारी के साथ नई बाइट सरणी लौटानी चाहिए।
उदाहरण: बाइट सरणी को देखते हुए {103, 100, 0, 51, 172, 217, 0, 113 , 1, 83, 229, 188, 4, 64, 0, 0, 3, 0, 64, 0, 0, 15, 3, 198, 12, 101, 128}, प्रारंभिक स्थिति (बिट्स में) 106 है, और बिट्स की संख्या 32 है। फ़ंक्शन को फिर {64, 0, 0, 0, 64} वापस आना चाहिए। छोड़े गए 3) और 1 के मान पर ध्यान दें। निर्दिष्ट 32 के बजाय यहां 40 बिट हैं, क्योंकि अंतिम बाइट पहले ही शुरू हो चुकी है या क्योंकि बिट्स में शुरुआती स्थिति बिट स्थिति 0 से संरेखित नहीं थी। फ़ंक्शन को छोड़े गए बाइट्स की संख्या भी लौटानी चाहिए ताकि मैं बिटस्ट्रीम में स्थिति को तदनुसार अपडेट कर सकूं।
एज केस: यदि अंतिम पढ़ा गया बाइट 3 है, और यह आंशिक रूप से पढ़ा गया है, इसे छोड़ा नहीं जाना चाहिए।
मूल बाइट सरणी को संशोधित नहीं किया जाना चाहिए।
मैंने कुछ समय पहले फ़ंक्शन को तुरंत लिखा था, और यह काम करता है। हालाँकि, मैं सीपीयू प्रदर्शन को बढ़ाने के लिए सुझाव प्राप्त करने के लिए इसे कोड समीक्षा पर पोस्ट कर रहा हूं।
उपयोग का मामला H.264 में विशिष्ट वस्तुओं को पार्स करना है। कभी-कभी, शून्य-बाइट्स के बीच तीन होते हैं ताकि डिकोडर शून्य-बाइट्स को एक नए फ्रेम के साथ भ्रमित न करे (इसे सीधे शब्दों में कहें)।
यह एक अनुवर्ती प्रश्न है क्योंकि मेरी पिछली प्रतिक्रिया प्रश्न ने पहले ही सुझाव दिया है कि मुझे यूनिट परीक्षण लिखना चाहिए और एक अलग कक्षा का भी उपयोग करना चाहिए।
रिटर्न टपल में सूची (बाइट की) के बजाय एक बाइट [] होना चाहिए, क्योंकि मुझे बाद में अन्य कार्यों के लिए इसकी आवश्यकता होगी। मैं इस फ़ंक्शन को प्रदर्शन के लिए अनुकूलित करना चाहता हूं। आपके इनपुट के लिए धन्यवाद!
मैंने आपके लिए एक परीक्षण प्रोजेक्ट/न्यूनतम संकलन योग्य उदाहरण बनाया है:
FormMain.vb (यदि आपको आवश्यकता है)
उस पद्धति से कक्षा
एनयूनिट परीक्षण
एक छोटा सा सुधार पर्याप्त बड़ी क्षमता निर्दिष्ट करके परिणामों की सूची को प्रारंभ करना है ताकि बाइट्स जोड़ने के लिए इसके आंतरिक सरणी का आकार बदलने की आवश्यकता न हो।
सूचियां एक से शुरू होती हैं 4 का छोटा सरणी आकार और फिर दोगुना यदि सरणी बहुत छोटी हो जाती है तो सरणी का आकार। सरणी का आकार बदलने से एक नई सरणी बनती है और फिर पुराने सरणी से सभी तत्वों को नए में कॉपी किया जाता है।
चूंकि currentBitPosition को हमेशा 8 से बढ़ाया जाता है, bitIndexWithinByte जो currentBitPosition Mod 8 पर सेट है, कभी नहीं बदलेगा। इसका उपयोग वर्तमान बिट स्थिति को पूर्ण बाइट्स में संरेखित करने के लिए किया जाता है। चूँकि यह संरेखण केवल एक बार किया जाना चाहिए, इसे व्हाइल-लूप से पहले करें।
वर्तमान बिटपोज़िशन को साथ क्यों रखें? आपको लूप के अंदर केवल currentByteIndex की गणना करने की आवश्यकता है। यह गणना लूप से पहले भी करें और इसके बजाय सीधे currentByteIndex को 1 बढ़ा दें।
लूप के भीतर काम कम कर दिया गया है और यूनिट परीक्षण अभी भी चल रहे हैं।
मुझे आश्चर्य नहीं होगा अगर इस कोड को C# में बदलने से गति और भी बेहतर हो जाएगी। यदि आपको वीबी प्रोजेक्ट में इसकी आवश्यकता है, तो आप एक सी# लाइब्रेरी प्रोजेक्ट (एक डीएलएल) बना सकते हैं और वीबी ऐप में एक प्रोजेक्ट संदर्भ जोड़ सकते हैं।
कंपाइलर (विशेष रूप से सी#), लाइब्रेरी, जेआईटी और सीएलआर टीमें हैं प्रत्येक .NET संस्करण में प्रदर्शन सुधार में अत्यधिक प्रयास करना। उपलब्ध नवीनतम .NET संस्करण का उपयोग करें।