2013-02-27 28 views
12

Object.observe() जावास्क्रिप्ट एपीआई किसी भी जावास्क्रिप्ट वस्तु के सभी गुण परिवर्तन के लिए परिवर्तन सूचनाएँ प्राप्त करने के कोड के किसी भी भाग की अनुमति देता है।ऑब्जेक्ट.ब्सर्व() प्रदर्शन को कैसे प्रभावित करता है?

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

ऐसा लगता है कि किसी भी अनुरूप JavaScript इंजन अब इस एपीआई के कारण प्रदर्शन में एक स्थायी और गंभीर नुकसान करने के लिए बंद है।

+0

"* यह निर्धारित करना संभव नहीं है कि किसी दिए गए ऑब्जेक्ट में अधिसूचनाएं सेट हों या नहीं?" - क्यों? – Bergi

+0

@ बर्गि आप इसे कैसे करेंगे? संहिता का मतलब कोड चलाने या किसी ऑब्जेक्ट का निरीक्षण किए बिना। – usr

उत्तर

17

आधुनिक जावास्क्रिप्ट इंजन का उपयोग करने के इनलाइन कैशिंग और अनुकूली रखता तकनीक उत्पन्न कोड पर गतिशील प्रेषण के प्रभाव को कम करने के लिए।

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

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

जिसके अनुसार, वी 8 में Object.observe का वर्तमान क्रियान्वयन मनाया वस्तुओं एक उच्च कीमत का भुगतान क्योंकि इससे उन्हें को सामान्य (उनमें शब्दकोश प्रतिनिधित्व में बदल जाता है) और प्रेक्षण रिकॉर्डिंग के लिए क्रम प्रणाली के माध्यम से दौर यात्राएं की आवश्यकता है बनाता है। लेकिन बाद में इस लागत को कम करने में कोई अंतर्निहित तकनीकी कठिनाइयां नहीं हैं।

+0

फिर भी, * * इंजनों को हमेशा के लिए एक गतिशील "छिपी कक्षा" दृष्टिकोण लेने की आवश्यकता है। फिलहाल स्थिर विश्लेषण या टाइप एनोटेशन (जावास्क्रिप्ट के भविष्य के संस्करण में) का उपयोग करके इन विशेषज्ञता अनुकूलन को हल करना संभव होगा। यह अब हमेशा के लिए असंभव होगा। जेएस अब पूर्ण प्रकार की जानकारी के साथ, जावा या .NET जितना तेज़ नहीं हो सकता है। – usr

+0

सबसे पहले मुझे ध्यान दें कि पूर्ण जावास्क्रिप्ट के लिए स्थिर प्रकार का विश्लेषण अपने वर्तमान रूप में बहुत महंगा और अव्यवहारिक है; और एनोटेशन टाइप करें कल की एक काल्पनिक चीज है और यहां तक ​​कि जब पेश किए गए इंजनों को पिछली संगतता के लिए "पुरानेस्कूल" अनियंत्रित कोड को चलाने के लिए छिपे हुए वर्गों को रखना होगा। दूसरा भाषा एक्स बनाम भाषा वाई की गति की कुछ अमूर्त धारणा की तुलना करना रचनात्मक नहीं है, आपको बेंचमार्क, भाषा पैटर्न जो हम चर्चा कर रहे हैं आदि निर्दिष्ट करना चाहिए और आखिरकार मैं विशेष रूप से रेखांकित दृष्टिकोण जहां कोड निष्पादित करता है * नहीं * जो कुछ भी जांचता है। –

+0

यह अंतिम दृष्टिकोण ऑब्जेक्ट.ब्सर्व को उस कोड को अपनाने पर निर्भर करता है जो संभावित रूप से मनाई गई वस्तुओं में लिख सकता है। यह कोड को deoptimizing करने के समान है, उदाहरण के लिए, डीबगर संलग्न है। चीजों को कैसे कार्यान्वित किया जाता है इस पर निर्भर करता है कि यह सब कुछ या केवल प्रभावित कार्यों को नष्ट कर सकता है। –

2

क्या यह कोड जनरेशन और प्रदर्शन अनुकूलन को गंभीर रूप से प्रभावित नहीं करता है जो जावास्क्रिप्ट इंजन (यानी वी 8) द्वारा किया जा सकता है?

हां। प्रॉक्सी, getters/setters और शायद प्रोटोटाइप वस्तुओं के रूप में सिर्फ एक ही - इन सबने जावास्क्रिप्ट में गतिशील हैं।

हालांकि, उनके asynchronity की वजह से नई (और बेहतर) अनुकूलन संभव हो जाएगा; और वे अन्य, अधिक अक्षम कोड अप्रचलित कर सकते हैं। Goals from the harmony draft हवाला देते हुए: ऐड पर,

  • कोई आवरण या प्रॉक्सी वस्तुओं की जरूरत
  • सूचनाएं बदलें स्मृति क्षमता और वस्तु पहचान उपलब्ध कराने/में किए गए संशोधन पर
  • सूचनाएं बदलें एक वस्तु पर एक संपत्ति की हटाना किसी ऑब्जेक्ट पर गुणों की संपत्ति डिस्क्रिप्टर
  • किसी ऑब्जेक्ट को मैन्युअल रूप से इंगित करने की क्षमता जब कोई एक्सेसर प्रॉपर्टी बदल जाती है
  • कुशलतापूर्वक कार्यान्वयन योग्य इंजन में
  • सरल, लक्षित, एक्सटेंशन वर्तमान ES
  • अतुल्यकालिक परिवर्तनों की सूचना है, लेकिन परिवर्तन की तुल्यकालिक प्राप्त कर रहा है की अनुमति देने के लंबित वितरण
संबंधित मुद्दे