2014-05-04 8 views
7

यह मेरी जानकारी है कि जावास्क्रिप्ट के साथ जब आप एक वस्तु पर एक प्रविष्टि को हटाने के लिए है, कम से कम क्रोम के साथ वस्तु "शब्दकोश मोड" या "धीमी गति से मोड"पेशेवरों और "शब्दकोश मोड" के विपक्ष

में रखता है उदाहरण:

var user = { name: 'connor', sex: 'male' }; 
// user is in "fast mode" 

delete user.sex; 
// user is in ("slow" or "dictionary") mode 

यह लाभकारी कब हो सकता है और यह हानिकारक कब हो सकता है?

एक विशिष्ट मामला जाने के लिए होगा, मेरे पास एक ऑब्जेक्ट है और जब एप्लिकेशन प्रारंभ होता है तो ऑब्जेक्ट खाली होता है, लेकिन जैसे ही कोड चलाया जाता है और एप्लिकेशन मेमोरी बन जाती है, यह संभावित रूप से बहुत बड़ी हो सकती है और ऑब्जेक्ट कभी नहीं होगा जब तक एप्लिकेशन बंद नहीं हो जाता तब तक आकार में कमी आती है।

क्या इस मोड के आसपास कोई अर्थशास्त्र भी है?

+0

'user.sex हटाएं;' के बाद 'user.sex = null' कभी भी perf मुद्दों में नहीं चलेगा –

+0

@ कॉनर: मैंने इन टिप्पणियों को एक उत्तर में जोड़ दिया है, हम शायद उन्हें अभी साफ़ कर सकते हैं। –

उत्तर

10

यह मेरी जानकारी है कि जावास्क्रिप्ट के साथ जब आप एक वस्तु पर एक प्रविष्टि को हटाने के लिए है, कम से कम क्रोम के साथ "शब्दकोश मोड" या "धीमी गति से मोड"

isn दैट 'में वस्तु डालता है एक जावास्क्रिप्ट चीज नहीं; यह कार्यान्वयन क्रोम के अंदर V8 इंजन की विशेषता है। This thread on the V8 users's list चर्चा इस:

[ZenWolf] ... एक वस्तु प्रभाव (sic) कैसे v8 वस्तु को अनुकूलित करेंगे से एक संपत्ति को नष्ट करने के लिए JavaScript "हटाएँ" कीवर्ड का उपयोग करता है? ...

[स्वेन पैन] ... "धीमी गति" पर जाने के लिए एक संपत्ति परिणाम हटाना, यानी वस्तु के गुणों के लिए एक शब्दकोश का उपयोग करना। तो अंगूठे के एक सामान्य नियम के रूप में, 'हटाएं' का उपयोग करके चीज धीमी हो जाती है ...

आप इस प्रभाव को in this JSPerf देख सकते हैं। ध्यान दें कि वी 8 (क्रोम, ओपेरा 20) का उपयोग करने वाले ब्राउज़र delete के बिना धीमे होते हैं। फ़ायरफ़ॉक्स का नवीनतम स्पाइडरमोन्की किसी भी तरह से अंधेरे से तेज है, आईई 10 और 11 थोड़ा प्रभावित हुआ। (दिलचस्प बात यह है कि इंजन ओपेरा 10.5 से 12 के लिए उपयोग किया जाता है [मुझे लगता है कि यह था], कारकन, delete द्वारा वी 8 की तुलना में अधिक प्रभावित था।)

यदि आप वेब ब्राउज़र में उपयोग करने के लिए कोड लिख रहे हैं, तो अनुकूलित करना एक विशिष्ट इंजन समय बर्बाद नहीं होता है जब तक कि आप उस इंजन पर एक विशिष्ट, असली दुनिया की प्रदर्शन समस्या का सामना नहीं कर रहे हैं। (और यदि आप हैं, तो एक बार जब आप इसका सामना कर लेंगे, तो सुनिश्चित करें कि वे परिवर्तन अन्य इंजनों को गड़बड़ नहीं करते हैं!)

यदि आप नोडजेएस, सिल्कजेएस आदि के लिए लिख रहे थे, तो निश्चित रूप से V8 के लिए अनुकूलित करना ठीक है (हालांकि समयपूर्व अनुकूलन के सामान्य नियम अभी भी लागू होते हैं), क्योंकि वे विशेष रूप से वी 8 के साथ बनाए जाते हैं।

क्या इस मोड के आसपास कोई अर्थशास्त्र भी है?

सं। जावास्क्रिप्ट के अर्थशास्त्र को विनिर्देशन द्वारा परिभाषित किया गया है, जो यह निर्धारित नहीं करता है कि वस्तुओं को कैसे लागू किया जाता है, बशर्ते उनका व्यवहार spec के अर्थशास्त्र से मेल खाता हो; spec प्रदर्शन मूल रूप से बिल्कुल संबोधित नहीं करता है। वी 8 गतिशील कक्षाओं को ऑन-द-फ्लाई उत्पन्न करके और उन्हें मशीन कोड में संकलित करके वस्तुओं को लागू करता है, लेकिन जब आप उनसे गुण हटाते हैं तो "धीमे" (शब्दकोश) मोड पर वापस आते हैं।लेकिन अन्य इंजनों उन्हें हैश नक्शे के रूप में लागू करने के लिए स्वतंत्र हैं (आप गुण जोड़ने हैं, स्वेन Panne के रूप में और अधिक आम आपरेशन उपर्युक्त उद्धरण में कहा, यह गतिशील रूप से एक व्युत्पन्न वर्ग है, जो doesn't slow things down। बनाता है) या लिंक किए गए गुण की सूची , या फिर कुछ और।

3

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

तो यह मूल रूप से एक बहुत संवेदनशील हेरिस्टिक है: यदि आप एक बार भी हटाते हैं, तो वी 8 मानता है कि आप भविष्य में भी वस्तु के आकार को बदलने जा रहे हैं और इसे छोड़ देते हैं - भले ही वास्तविकता में आप केवल कॉल करने जा रहे हों केवल एक बार हटाएं और इसके बाद आकार अपरिवर्तित हो।

लाभ यह है कि हैश टेबल लुकअप करना छुपा वर्ग (और पुराने छिपे हुए वर्ग के आधार पर सभी कार्यों को फिर से संकलित करने) की तुलना में बहुत तेज़ है, जब भी आकार बदल जाता है।

+0

धन्यवाद Esailija – iConnor

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