Node.js में क्लोनिंग ऑब्जेक्ट्स: तेज़, गहरा, अधिक निविदा!

बहुत पहले नहीं, idoroshenko के एक लेख को पढ़ने के बाद "क्यों eval हमेशा खराब नहीं होता है," मुझे आश्चर्य हुआ कि क्या वस्तुओं को क्लोन करने के लिए एक फ़ंक्शन के शरीर को उत्पन्न करने के साथ दृष्टिकोण का उपयोग करना संभव है। यहां तक ​​कि इसके लिए एक छोटी सी लाइब्रेरी भी लिखी। बेंचमार्क में अविश्वसनीय परिणाम मिले, लेकिन इस दृष्टिकोण की प्रयोज्यता केवल समान वस्तुओं के कई क्लोनिंग तक सीमित थी।

इसलिए, मेरे पास एक सवाल था: क्या छिपी हुई कक्षाओं के कई मनोरंजन से जुड़ी लागतों से बचने के लिए वास्तव में v8 में कोई अन्य तरीका नहीं है? आखिरकार, यह संसाधनों का मुख्य अपशिष्ट है जब हम वस्तुओं को क्लोन करते हैं। जैसा कि यह निकला, वास्तव में ऐसी संभावना है: v8 में ही, वस्तुओं में v8 :: ऑब्जेक्ट :: क्लोन विधि है। यह विधि शब्द के व्यापक अर्थों में वस्तुओं को क्लोन करती है, अर्थात, स्वयं वस्तुओं, साथ ही साथ सरणियों, तिथियों, नियमित अभिव्यक्तियों, कार्यों आदि, जबकि गैर-मानक वाले (उदाहरण के लिए, सरणियों के नामित गुण) सहित उनके सभी गुणों को संरक्षित करना। यहां तक ​​कि छिपा हुआ।

केवल एक छोटी सी समस्या थी। इस पद्धति का उपयोग केवल नोड के धनुष में किया गया था। और जावास्क्रिप्ट के लिए बाहर की ओर खुला नहीं था।

दो बार सोचने के बिना, मैं सी ++ में एक्सटेंशन बनाने पर नोड.जेएस प्रलेखन में चढ़ गया और एक मॉड्यूल का परीक्षण संस्करण लिखा, जो इस फ़ंक्शन का विस्तार करता है।

लगभग 10-100 बार विभिन्न वस्तुओं के लिए त्वरण प्राप्त करने के बाद, मुझे एहसास हुआ कि इस तकनीक में काफी संभावनाएं हैं, और इसे नोड-वी-क्लोन ( एनपीएम ) मॉड्यूल में लागू करना शुरू कर दिया, इस तरह से क्षमता को खोने की कोशिश नहीं की, एक मिश्रण का उपयोग करके TDD और बेंचमार्क संचालित विकास। इसने हमें विकास और समस्याओं के सुधार के दौरान गति की निगरानी करने और साथ ही साथ अनुकूलन के दौरान प्रतिगमन की निगरानी करने की अनुमति दी। उसी समय, चूंकि बेंचमार्क और परीक्षण तैयार थे, इसलिए मैंने अपने मॉड्यूल की दूसरों के साथ तुलना करने का फैसला किया:


क्लोनिंग की गुणवत्ता


लक्ष्यों में से एक अधिकतम क्लोनिंग गुणवत्ता प्राप्त करना था। क्लोनिंग प्रक्रिया के लिए पर्याप्त अप्रिय स्थितियों के साथ आने के लिए मुझे अपनी कल्पना का दोहन करना पड़ा। इनमें शामिल हैं, उदाहरण के लिए, फ़ंक्शन, क्लोजर, तर्क, वर्तमान स्थिति और उपयोगकर्ता-जोड़ा गुणों के साथ नियमित अभिव्यक्ति। मेरा मॉड्यूल इन स्थितियों से इस तरह से निपटता है:


प्रतियोगी कैसे कर रहे हैं, इसका मूल्यांकन यहां किया जा सकता है

मुझे लगता है कि यह बहुत योग्य निकला।

गति


यह मान लेना स्वाभाविक होगा कि उच्च गुणवत्ता वाले क्लोनिंग के समर्थन के कारण गति में गिरावट आई होगी। और गति वास्तव में गिर गई, लेकिन इतना नहीं कि नोड-वी 8-क्लोन ने अधिकांश स्थितियों में प्रधानता खो दी।
उदाहरण के लिए, यहां 100 तत्वों {'_0': '_0', ..., '_99': '_99'} (प्रति संचालन में संचालन) के साथ किसी वस्तु के सतह क्लोनिंग के परिणाम हैं:

घोंसले के 4 स्तरों में स्थित 500 नेस्टेड सरणियों की गहरी क्लोनिंग, जिसमें 900 लाइनें शामिल हैं (यह नोड-वी 8-क्लोन से क्लोनिंग के अनुकूलित संस्करण की तुलना भी करता है, जो एक और परीक्षा पास नहीं करता है, लेकिन सरणियों की गहरी क्लोनिंग के काम को गति देता है):

लेकिन छोटे सरणियों के साथ, चीजें कुछ हद तक बदतर हैं। यह सी ++ मॉड्यूल तक पहुंचने की उच्च लागत को प्रभावित करता है, ताकि सरल एल्गोरिदम, जैसे कि एक फायदा हो।


सभी बेंचमार्क परिणाम।

आगे क्या है


नोड.जेएस बफ़र्स के क्लोनिंग को ठीक करने के लिए जा रहे हैं। अब वे क्लोनिंग कर रहे हैं (a! == b), लेकिन वे एक ही मेमोरी क्षेत्र की ओर इशारा करते हैं और उनकी सामग्री अभी भी जुड़ी हुई है।
मैं तर्कों की क्लोनिंग को ठीक करना चाहूंगा। जब किसी फ़ंक्शन में तर्क होते हैं, तो तर्क ऑब्जेक्ट फ़ंक्शन के संदर्भ से संबद्ध हो जाते हैं, और जब क्लोन किया जाता है, तो वे भी संबंधित हो जाते हैं।
मैं और भी पेचीदा इनकमिंग डेटा के साथ आना चाहूंगा, उदाहरण के लिए फ़ाइल डिस्क्रिप्टर, मॉड्यूल, टाइमर ... मुझे उम्मीद नहीं है कि मैं वास्तव में उनका क्लोन बना सकता हूं, लेकिन कम से कम मैं यह समझना चाहूंगा कि यह मॉड्यूल उनके साथ कैसा व्यवहार करेगा।

मुझे किसी भी प्रतिक्रिया, सुझाव, कीड़े और पैच के लिए खुशी होगी। खैर, मुझे GitHub पर कांटा :)

Source: https://habr.com/ru/post/In147124/


All Articles