2014-09-21 5 views
7

मैं समझता हूं कि रोज़लिन के प्री-रिलीज संस्करण ने एरिक लिपर्ट द्वारा this excellent blog post में वर्णित अपरिवर्तनीय वृक्षों को लागू किया था। हालांकि, यह पोस्ट समाप्त होता है:Roslyn के रिलीज़ संस्करण अपरिवर्तनीय पेड़ों को कैसे लागू करता है?

"लागत यह है कि यह प्रणाली जटिल है और" लाल "मुखौटे बड़े होने पर बहुत मेमोरी का उपभोग कर सकते हैं। वर्तमान में हम यह देखने के लिए प्रयोग कर रहे हैं कि हम कुछ को कम कर सकते हैं या नहीं लाभ खोने के बिना लागत। "

मैं पूछना चाहता हूं कि रिलीज संस्करण के लिए परिणाम क्या था। मैंने Roslyn sources की जांच शुरू कर दी है लेकिन कोड का पालन करने के लिए काफी जटिल है।

मुझे जो दिलचस्पी है वह ऊपर उल्लिखित लागतों के बारे में निम्न स्तर के डिज़ाइन परिणाम हैं।

  1. लाल/हरे नोड्स के संदर्भ में एक ही संपादन की लागत क्या है?
  2. अन्य परिचालनों के लिए कौन से अनुकूलन किए गए हैं (उदा। हटाएं, पूर्ववत करें)?
+1

मुझे लगता है कि इसका उपयोग करना आसान है: http://source.roslyn.codeplex.com/#Microsoft.CodeAnalysis/Syntax/SyntaxNode.cs,849dc6029695ef7b – MarcinJuraszek

+1

इसके अलावा [बीसीएल अपरिवर्तनीय संग्रह] पर एक नज़र डालें (http://channel9.msdn.com/posts/Erik-Meijer-Immo-Landwerth-and-Andrew-Annott-Imututable-Collections-for-NET) जो Roslyn Red/Green पेड़ों से प्रेरित थे। – DaveShaw

+0

@ डेवशॉ, मैंने लिंक पर एक त्वरित नज़र डाली, और वीडियो देखेंगे। हालांकि वर्णन पृष्ठ पेड़ का जिक्र नहीं करता है, लेकिन यह कई अन्य संग्रह प्रकारों का उल्लेख करता है। – bright

उत्तर

6

यहाँ चर्चा मंचों पर रोसलिन के प्रदर्शन और अपरिवर्तनीय पेड़ के कार्यान्वयन VSadov द्वारा में एक शानदार देखो नहीं है: https://roslyn.codeplex.com/discussions/541953

एक उच्च स्तर की उम्र में उन्होंने संगामिति, हरे नोड्स के डी-डुप्लीकेशन, टर्मिनलों के डी-डुप्लीकेशन की चर्चा और पेड़ के पेड़ों के भीतर तारों का डी-डुप्लिकेशंस।

वह लाल पेड़ों की आलस्य के बारे में भी बात करता है। प्रत्येक पाठ परिवर्तन के बाद लाल पेड़ की गणना करने के बजाय, लाल पेड़ की गणना तब होती है जब कोई इसका अनुरोध करता है।

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

+0

धन्यवाद, मैंने आपका जवाब स्वीकार कर लिया है। अंडो लागू करने के तरीके के बारे में एक निश्चित उत्तर प्राप्त करना अच्छा लगेगा। – bright

+3

कमजोर रेफरी के बारे में आपकी परिकल्पना सही है। –

2

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

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

कंपाइलर में कोई अन्य अनुकूलन नहीं किया गया है। हम पूर्ववत करने के बाद आईडीई में एक कैश किए गए पेड़ का पुनः उपयोग करते हैं, लेकिन मुझे यकीन नहीं है।

+0

मैं समझता हूं कि सिंटेक्स नोड == लाल नोड, ग्रीन नोड == हरा नोड। SyntaxToken पेड़ संरचना में फिट कैसे करता है? – bright

+0

तो एक पूर्ववत के लिए एक पूरे कैश किए गए पेड़ है, यानी, हर एक चरित्र सम्मिलन के लिए एक नया पेड़ है? यह निषिद्ध रूप से महंगा लगता है, तो क्या आप कृपया स्पष्टीकरण दे सकते हैं? – bright

+0

प्रत्येक संपादन के लिए एक "नया पेड़" है, लेकिन याद रखें कि अधिकांश हरे नोड्स लगातार संपादन में साझा किए जाते हैं। यदि पेड़ गहराई 'एच' है, तो औसतन केवल नए ओ (एच) हरे नोड बनाए जाते हैं। वहां * पेड़ के प्रत्येक संस्करण में एक अलग लाल नोड हो सकता है, लेकिन लाल नोड्स आलसी ढंग से बनाए जाते हैं, और अधिकांश समय आईडीई वास्तव में लाल नोड्स को महसूस नहीं करता है, क्योंकि यह मामूली के बाद काम करता है तेजी से लगातार संपादन के मामले में देरी। –

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