
अभी तक ब्राउज़रों और नोडज के लिए कॉम्पैक्ट (3.5 Kb) और तेज
doT.js टेम्पलेट
इंजन (v.1.0.1) केवल सरणियों पर पुनरावृत्त हुआ है। इसमें सरणियों की उपस्थिति के लिए नियंत्रण वस्तु को समायोजित करने के लिए हमेशा सुविधाजनक नहीं होता है। टेम्पलेट इंजन को
एक कंडीशन चेक के साथ इसमें
ऑब्जेक्ट्स पर एक
पुनरावृत्त की उपस्थिति के लिए अनुकूलित करना बेहतर है। वस्तुओं पर छोरों में स्थितियों की जांच करना अक्सर आवश्यक होता है - यह है hasOwProperty (), और एक DOM ऑब्जेक्ट के लिए जाँच, और अनुक्रमित करने के लिए हैश का हिस्सा लेना।
वे किसी टेम्प्लेट में किसी सरणी पर पुनरावृति कैसे लिखते हैं? कुछ इस तरह:
{{~it.elemsArray:property:i}} ... {{~}}
लूप के अंदर, आप {{= संपत्ति}} (वर्तमान संपत्ति का मूल्य), {{= i}} (सरणी सूचकांक) और उन पर आधारित अभिव्यक्तियों का उपयोग कर सकते हैं। कुछ भी नहीं केवल एक सरणी के लिए टेम्पलेट इंजन में एक चेक जोड़ने से रोकता है, लेकिन चक्र के आगे निर्माण का सही ढंग से चयन करने के लिए एक वस्तु के लिए भी। ऐसा करने के लिए, आपको एक काफी सरल टेम्पलेट इंजन के अंदर जाना होगा और उस चक्र को फिर से लिखना होगा जो पहले से ही सरणियों पर काम कर रहा है जो वस्तुओं पर काम करेगा। बेशक, सामान्य कोड में मूल अवसर।
टेम्पलेट इंजन में एक और प्रकार का पुनरावृत्ति जोड़ें।
(शस्त्रागार में टीमों की संख्या एक से बढ़ जाएगी - {{@ ...}}, इसलिए टेम्पलेट इंजन थोड़ा धीमी गति से काम करेगा - जबकि टेम्पलेट द्वारा दूसरे regexp की खोज की जाएगी।) {{@ it.elemsObject : property : i : condition}} ... {{@}}
(दूसरा संभावित विकल्प)यदि आप पुनरावृत्तियों को एक में जोड़ते हैं, तो व्यावहारिक रूप से कोई मंदी नहीं होगी, क्योंकि नियमित अभिव्यक्ति थोड़ी जटिल होगी, और फिर, अपने आप को अंत में।
(हम अब इस विकल्प को लागू नहीं करेंगे, ताकि टेम्पलेट इंजन को दूसरे में न बदल सकें।) {{~ it.elemsObjectOrArray : property : i : condition}} ... {{~}}
आगे की कोड पीढ़ी जटिल होगी, लेकिन यह तेजी से जाना जाता है। (धीमी, सबसे अधिक संभावना है, टेम्पलेट को पार्स भी नहीं किया जाएगा, लेकिन संश्लेषित कोड की व्याख्या।)
यहां "
स्थिति " अभिव्यक्ति का केवल निष्पादन योग्य हिस्सा है। इस टेम्पलेट इंजन की ख़ासियत, साथ ही कई अन्य, यह है कि यह एक जेएस-कोड (जिसे एक टेम्पलेट कहा जाता है) को संश्लेषित करता है, इसे एक निष्पादन योग्य फ़ंक्शन में बदल देता है, और तुरंत इसे निष्पादित करता है। हम इसका उपयोग केवल अभिव्यक्ति के हिस्से को
संपत्ति के मूल्य से जोड़ने के लिए करेंगे, जिसका मूल्यांकन लूप में किया जाता है। जैसा कि आप जानते हैं, जेएस में वस्तुओं पर एक लूप अक्सर ऐसा दिखता है:
if(it.elemsObject) for(var i in it.elemsObject){ var property = it.elemsObject[i]; if(property condition){ ... ... }};
यह वास्तव में हमारे ऐड-ऑन में ऑब्जेक्ट पर चलने वाला पुनरावृत्ति है। वाक्यात्मक रूप से समझ में नहीं आने वाली "संपत्ति की स्थिति" हमारी चाल है जो इस टेम्पलेट इंजन के पहले से ही मौजूद दोष का पूरा उपयोग करती है - नए फ़ंक्शन () में eval () का निहित निष्पादन। कोड की वाक्यात्मक अखंडता का उल्लंघन नहीं करने के लिए, यह आवश्यक है कि
शर्त के साथ अनुपालन करना आवश्यक होगा एक
शर्त एक अभिव्यक्ति है जो
संपत्ति के साथ युग्मन करते समय अर्थ नहीं बदलती है।
यहां 3 सबसे लोकप्रिय उदाहरण हैं जब आपको इसकी आवश्यकता होती है और यह कैसा दिखेगा।
1.
अपने स्वयं के गुणों का चक्र{{@ it.elemsObject: propName: ii: .hasOwnProperty (ii)}} ... {{@}}
2.
DOM तत्वों का चक्र {{@ it.elemsObject : elName : ii :.attributes}} ... {{@}}
एक लूप देंगे:
var arr1 = it.elemsObject; if(arr1) for(var ii in arr1){ var elName = arr1[ii]; if(elName.attributes){ out += '...' }}
3.
मुख्य वस्तु का चक्र {{@ it.elemsObject : elName : ii :, /y\d+/.test(ii) }} ... {{@}}
केवल उन वस्तुओं के पुनरावृत्तियों के लिए चयन करता है जिनके सूचकांक "y <संख्या>" जैसे दिखते हैं।
अंतिम उदाहरण टेम्पलेट का उपयोग करने के लचीलेपन को बहुत विस्तारित करता है - आप एक सामान्य वस्तु की जड़ में तत्वों के एक या अधिक संग्रह रख सकते हैं जो सूचकांक के प्रारूप या उनके मूल्यों के गुणों में भिन्न होते हैं। (उदाहरण के लिए, मान एक संपत्ति के साथ एक वस्तु हो सकते हैं - एक संग्रह का संकेत। यह भी दर्शाता है कि एक टेम्पलेट में डिफ़ॉल्ट प्रोपनाम नाम को केवल एक अल्पविराम लगाकर अभिव्यक्ति को अभिव्यक्ति में बदल देना कितना आसान है।
मौजूदा टेम्पलेट इंजन में, ऐसे चक्र, वास्तव में, "मूल्यांकन" निर्माण का उपयोग करके महसूस किया जा सकता है:
{{<मनमाने ऑपरेटरों "
}} । फिर मुझे खाके में अपने चक्र का पूरी तरह से वर्णन करना होगा। लेकिन इसके बजाय, हम सशर्त अभिव्यक्ति की संक्षिप्त संकेतन करने के लिए सरणियों पर लूप के निर्माण के लिए एक छोटा सा जोड़ बनाते हैं जो इसकी व्यापकता को नहीं खोता है। यह एक फ़ंक्शन में अभिव्यक्ति को लपेटने के लिए (बड़ी प्रणालियों के लिए) थोड़ा सक्षम होगा (ताकि एक समग्र सिंटैक्स न हो), जो, वैसे, इसे धीमा कर देगा और स्थिति में स्पष्ट रूप से नाम
संपत्ति लिखने की आवश्यकता होगी।
संदर्भ के लिए, लूप जो मौजूदा टेम्प्लेट इंजन को सरणियों में बनाता है वह इस तरह दिखता है:
var arr1 = it.elemsObject; if(arr1){ var vname, ii =-1, l1 = arr1.length -1; while(ii < l1){ vname = arr1[++ii]; out += '...' }}
इसलिए, वह वस्तुओं के साथ काम नहीं कर सका - वह एक काउंटर का उपयोग करता है। जो कि संभवतः सार्वभौमिक फॉर-इन चक्र की तुलना में थोड़ा तेज़ है, लेकिन समय का नुकसान साइकिल पर नहीं जाता है। संश्लेषित टेम्पलेट की व्याख्या करने में समय बर्बाद होता है। मौजूदा टेम्पलेट्स के प्रदर्शन और व्यवहार को पूरी तरह से संरक्षित करने के लिए हम इसे इस विस्तार में नहीं सुधारेंगे।
हमारे नए प्रकार के चक्र में है, अंत में सी स्थिति, एक छोटी लेकिन प्राकृतिक प्रतिबंध - आप इसमें एक पंक्ति में 2 वर्ण "}" का उपयोग नहीं कर सकते हैं। सभी मामलों में, कोड को प्राप्त करना आसान है। कार्यों की परिभाषाओं के साथ बहु-पंक्ति अभिव्यक्तियों को लिखने की अनुमति है, उदाहरण के लिए, केवल यह भूलकर कि "}}" पुनरावृत्ति हैडर का अंत है। एक उदाहरण:
{{@ it :year:i:, aa = function(){ return 1234; }, /^y\d+$/.test(i + aa) }}
इन सुविधाओं के साथ, टेम्पलेट आसानी से छोटे HTML आवेषण के साथ कार्यों के विवरण में बदल जाता है (और इसके विपरीत नहीं)। यह आवश्यक रूप से सुविधाजनक नहीं है, लेकिन हमने आईटीआर में जेएस पर प्रतिबंधों को हटा दिया।
संबंधित सुधार
आप प्रोपनाम नहीं लिख सकते हैं: ii मान - टेम्पलेट इंजन में पार्सिंग रेगेक्सपी को समायोजित किया गया है, ताकि मानों की अनुपस्थिति में, डिफ़ॉल्ट नाम प्रतिस्थापित किए जा सकें। डिफ़ॉल्ट प्रॉपर्टी का नाम arrI1, arrI2 और ऑनर, इट्रेटर हैडर की अनुक्रम संख्या पर निर्भर करता है। किसी ऑब्जेक्ट का डिफ़ॉल्ट इंडेक्स i1, i2 या बाद का है। ऐतिहासिक कारणों से ऐसे अजीब नामों को चुना गया था - सरणी सूचकांकों के लिए doT.js में वही मौजूद हैं, और निहित सरणी नाम arr1, arr2 और उससे आगे की तरह दिखते थे। हम सिर्फ परंपरा रखते हैं: यदि हैश नाम arr1 है, तो इसका गुण नाम arrI1 (arr1 (i1 i1) के बराबर) है। उदाहरण के लिए
{{@ it.elemsObject :::.attributes}}
करने के लिए tantamount
{{@ it.elemsObject : arrI1 : i1 :.attributes}}
(यदि यह टेम्पलेट में पहला पुनरावृत्ति शीर्षक है)
या
{{@ it.elemsObject : arrI2 : i2 :.attributes}}
(यदि यह टेम्पलेट में दूसरा पुनरावृत्त हैडर है, आदि)
यदि आप टेम्पलेट को पढ़ने की गुणवत्ता के बारे में सोचते हैं, तो डिफ़ॉल्ट नाम ऑब्जेक्ट के यौगिक नाम में अंतिम के रूप में चुनना अधिक सही होगा। इस उदाहरण में, ElemsObject। यह इस तरह होगा: {{@ it.elemsObject}} के बराबर {{@ it.elemsObject: elemsObjectI1: i1}}। लेकिन ऐतिहासिक पत्राचार के लिए, हम एक पुनरावृत्त के लिए इस तरह के नियम का परिचय नहीं देंगे।
* दूसरा महत्वपूर्ण जोड़। मान 0 के साथ तत्वों को रोकने के लिए || '' || असत्य || शून्य हटाया जा रहा है, लूप फिल्टर सही हो जाता है (फ़िल्टर काम नहीं करता है) यदि इट्रेटर हेडर में अभिव्यक्ति अनुपस्थित है।
और तीसरा - पहले पैरामीटर (सरणी या ऑब्जेक्ट का नाम) के लिए regexp में मल्टी-लाइन पार्टनर पैटर्न को सिंगल-लाइन ("। +") द्वारा प्रतिस्थापित किया जाता है। इससे पार्सिंग का थोड़ा त्वरण होता है (माप में 3%)।
4. इनलाइन सिंगल-लेवल (मल्टी-लाइन) हैश रिकॉर्ड करने की क्षमता जोड़ा, जैसा कि
jsfiddle उदाहरण में देखा गया है। इनलाइन सरणियों (वस्तुओं पर एक पुनरावृत्ति में) लिखना संभव है, जैसा कि एक ही उदाहरण में देखा जा सकता है।
गति तुलना
टेम्पलेट इंजन में वस्तुओं के माध्यम से एक चक्र की संभावना सहित निष्पादन समय के संदर्भ में हम कितना भुगतान करेंगे?प्रश्न का उत्तर परीक्षण द्वारा दिया जाएगा, जो गितुब पर doT.js परियोजना में निहित है। इसे फिर से लिखना होगा, क्योंकि यह संकलित टेम्पलेट्स की गति को मापता है, और संकलन गति में अंतर प्राथमिक रुचि का है। सरलता के लिए, हम
क्रोम (संस्करण 30)
में परीक्षणों पर विचार करेंगे। अन्य ब्राउज़रों पर, वे समान निष्कर्ष और तुलनाओं को दोहराना और आकर्षित करना आसान हैं।
यह मूल रूप से बहुत छोटे doU.js और पूर्ण doT.js की तुलना करने के लिए बनाया गया था, और दिखाता है कि पूर्ण doT.compile () फ़ंक्शन के निष्पादन योग्य भाग को कितना छोटा किया गया है। यह भी साबित हुआ है कि इसके बजाय "इट" के उपयोग से लंबे टेम्पलेट्स पर लगभग कोई फर्क नहीं पड़ता है, इसलिए परीक्षण अलग-अलग सरल विकल्पों की माप लाइनों के साथ लाजिमी है। टेम्प्लेट जिसकी गति मापी जाती है वह इस तरह दिखता है:
<h1>Just static text</h1>\ <p>Here is a simple {{=it.f1}} </p>\ <div>test {{=it.f2}}\ <div>{{=it.f3}}</div>\ <div>{{!it.f4}}</div>\ </div>
या इसके संशोधन, या दोहराव कई बार (32-128-256)। हम इन परीक्षणों में रुचि रखते हैं यह दिखाने के लिए कि इटरेटर हेडर के लिए एक अतिरिक्त चेक सरल टेम्प्लेट के संचालन को धीमा नहीं करता है।
हमारे उद्देश्यों के लिए, लूप परीक्षण भी रुचि के हैं। ताकि उनकी गति सरल टेम्प्लेट की गति के लगभग बराबर हो, परीक्षण के लिए ऐसा टेम्प्लेट लिखा जाता है (यह बिना लाइन ब्रेक के है):
<h1>Text from hash</h1><div>\ {{@it::i}} <div>{{=i}}: {{=it[i]}} : </div> {{@}}\ {{@it:val:i}} <div>{{=i}}: {{=val}} : </div> {{@}}\ {{@it:a}} <div>{{=a}}: {{=a}} : </div> {{@}}\ </div>
पुराने doT.js टेम्प्लेट इंजन संस्करण 1.0.1 में परीक्षण के लिए, अक्षर "@" को "~" से बदल दिया गया। एक ही - सरणियों पर परीक्षण के लिए - एक नए में। और डेटा का उपयोग एक मामले के लिए किया गया था - हैश, दूसरे के लिए - समान संख्या में तत्वों के साथ सरणियाँ। चार्ट के निचले भाग में परिणामों के अनुसार, हम देखेंगे कि कौन सा तेज है।
दोनों असम्पीडित (doT11.js) और संपीड़ित (doT11m.js) नए संस्करण में दिलचस्पी लेंगे। परीक्षणों को पारित करने के लिए, प्रत्येक संस्करण में डीओटी चर को अद्वितीय बनाना पड़ता था। तस्वीरें परीक्षणों को पारित करने की गति (प्रति सेकंड गणना की संख्या) के आरेख दिखाती हैं: अधिक तेज़ है, और इसलिए बेहतर है। पहली तस्वीर
संकलित टेम्पलेट्स का परिणाम (ध्यान) है। इसलिए, वे इतनी तेजी से हैं - 500-700 K प्रति सेकंड, और मिनीफाइड संस्करण और असम्पीडित के बीच अंतर का मतलब यह नहीं है कि हम देखना चाहते हैं। लेकिन यह परीक्षण दर्शाता है कि संकलन परिणामों की तुलना में पूर्ण चक्र (लाइनें "5. doT.js", 6, 7) कितना धीमा है (एक बड़ा संकेतक बेहतर है)।

परिणाम बताते हैं कि टेम्पलेट का संकलन समय कुल समय का एक बड़ा हिस्सा लेता है - छोटे टेम्पलेट के लिए 99% से लेकर 90% तक (10KB से अधिक) तक, और फिर से शुरू किए गए ब्राउज़र के लिए - 92% और 75% समान शर्तों के तहत। यह अंतर्निहित निष्कासन () के लिए शुल्क है, जिसे डिसेरिएलाइजेशन के दौरान किया जाना चाहिए।
संख्याओं के अनुसार, न्यूनतम कोड 1-1.5% तेजी से काम करता है। और संकलित टेम्पलेट्स का निष्पादन, सिद्धांत रूप में, आमतौर पर minification पर निर्भर नहीं होना चाहिए। निर्भरता या तो यादृच्छिक त्रुटियों, या कार्यों की संकलन त्रुटियों, या एक मापने वाले उपकरण की त्रुटियों की अभिव्यक्ति है।
फ़ायरफ़ॉक्स 25 के लिए एक ही परीक्षण IE 8 (क्रोम की तुलना में 8 गुना धीमा) के लिए एक ही परीक्षण विशेष नोट में 2 प्रकार के चक्रों की तुलना है। जैसा कि अपेक्षित था, एक सरणी लूप लगभग समान पैटर्न पर तेजी से काम करता है, लेकिन थोड़ा अलग डेटा। अंतर 20% है लघु टेम्पलेट के लिए, मध्यम लंबाई के टेम्पलेट के लिए 25% (टेम्पलेट में 300 तक चक्रों की संख्या के साथ 2-5 KB)। 100 या अधिक चक्रों के साथ, क्रोम में एक दिलचस्प प्रभाव दिखाई देता है, जाहिरा तौर पर संकलित फ़ंक्शन में चर की संख्या से संबंधित है। वस्तुओं पर एक चक्र का प्रदर्शन सामान्य स्तर पर रहता है, और टेम्पलेट पर चक्र (और चर) की संख्या में वृद्धि के साथ सरणियों पर चक्र अचानक तेजी से शिथिलता से शुरू होता है। उदाहरण के लिए, 190 चक्रों के साथ, टेम्पलेट परीक्षण 10% धीमा हो जाता है, और 750 चक्रों के साथ यह लगभग बिल्कुल धीमा हो जाता है - वस्तुओं के लिए टेम्पलेट की गति का 6%।
निम्नलिखित आंकड़ा 386 छोरों (एक बड़ा संकेतक बेहतर है) के साथ लंबे पैटर्न पर सरणियों पर छोरों के पतन की शुरुआत को दर्शाता है।

एक दिलचस्प सवाल यह है कि क्या वस्तुओं पर एक चक्र के लिए एक पतन सीमा है? हां। परीक्षण टेम्पलेट की मात्रा 2 गुना (लघु टेम्पलेट की 512 प्रतियों तक) को बढ़ाते हुए, हम ब्राउज़र को सरणी पर पुनरावृत्तियों और ऑब्जेक्ट्स के लिए 10 गुना कम चक्र गति पर फ्रीजिंग प्राप्त करते हैं। (शायद, इस मोड में, कुछ अनुकूलित नहीं है और कुछ स्टैक ओवरफ्लो होता है। या क्या यह इस परियोजना में उपयोग की जाने वाली परीक्षण स्क्रिप्ट से प्रभावित है, जो मानकीकरण के अलावा, हजारों और सैकड़ों हजारों परीक्षण करता है, और यह भी हो सकता है "लीक" के लिए कुछ। इस बीच, हम निष्कर्ष निकालते हैं कि टेम्पलेट में और सामान्य रूप से जेएस कार्यों में साइकिल की संख्या पर एक सीमा होती है। एक टेम्पलेट (क्रोम के लिए) में वस्तुओं पर 1000 से अधिक चक्र न करना बेहतर है।)
ओपन ब्राउज़र के ऑपरेटिंग समय के साथ टेम्पलेट इंजन के काम में एक सामान्य मंदी का प्रभाव और इसमें माप लेना भी देखा जाता है। इसी समय, सरणियों पर काम की गति वस्तुओं पर गति के सापेक्ष इतनी अधिक वृद्धि नहीं दिखना शुरू हो जाती है।
पैटर्न व्याख्या दर
गति के प्रश्न में प्रारंभिक रुचि वस्तुओं पर पुनरावृत्त की
व्याख्या की गति में थी। हमने पहले ही पता लगा लिया है कि सरणी द्वारा संकलित टेम्पलेट अधिक तेज़ है। लेकिन डेवलपर्स अक्सर संकलित टेम्पलेट्स में नहीं, बल्कि उनकी व्याख्या में रुचि रखते हैं, भले ही यह निष्पादन चरण की तुलना में 10-100 गुना धीमा हो। आखिरकार, यदि आपको 30 एमएस में एक पेज को रेंडर करने की आवश्यकता है, तो आप आमतौर पर 3 एमएस में बाद के रेंडरिंग के लिए संकलन के बारे में नहीं सोचते हैं। हम एक ही वर्कपीस फ़ंक्शन और डेटा का उपयोग करके अपने टेम्प्लेट की व्याख्या के लिए परीक्षण करेंगे। यह यहां है कि एक मानकीकृत मानक बनाने की तैयारी अपनी भूमिका निभाएगी - माप की पहली श्रृंखला में, इससे कोई फर्क नहीं पड़ा।
मौजूदा परीक्षणों में अलग संकलन (निष्पादन के बिना) के लिए एक अलग पृष्ठ भी है। हम रेंडरिंग टेम्प्लेट्स के निष्पादन को जोड़कर इसे पूरा करने के लिए परीक्षणों को परिवर्तित करते हैं। यह, व्यावहारिक रूप से, चित्र नहीं बदलेगा, लेकिन यह यथार्थवादी परीक्षण देगा, व्यावहारिक कार्यों के समान।
फ़ाइल
doT / मानक / compileBench.html चलाएँ ।
परीक्षणों के इस समूह ने हमें दिलचस्पी दिखाने वाली हर चीज दिखाई:
1) कीमा बनाया हुआ कोड एकल शॉर्ट पैटर्न के लिए स्थिर त्वरण दिखाता है - 5% द्वारा;
2) उसी के लिए, लेकिन असम्पीडित कार्य, लघु पैटर्न माप चक्र के साथ परीक्षणों में पुराने कोड की तुलना में मंदी का प्रदर्शन करते हैं, 4% से;
3) लंबे टेम्पलेट्स के लिए, नया कोड हमेशा 3% से लगातार तेज होता है;

यह सहज रूप से लग रहा था कि तुलना 10% की मंदी दिखाएगी, खासकर जहां सरणियों को पार्स करने की आवश्यकता होती है - पैटर्न के अनुसार रीजैक्सप पास पर काम लगभग इतना बढ़ जाता है। परिवर्तन इन मान्यताओं का अनुपालन दिखाते हैं, लेकिन इतना महत्वपूर्ण नहीं है। सबसे पहले, यह गुणों के नुकसान के बिना सरणी टेम्पलेट के सुधार के द्वारा मुआवजा दिया जाता है ("। *"), और दूसरी बात - टेम्पलेट 4% से छोटे टेम्पलेट पर धीमी हो गई है (सभी पर, न केवल सरणियाँ), लेकिन अंतर लंबे समय तक गायब हो जाता है - यह है अपेक्षित मंदी है।
चक्रों (अंतिम 3 मापों) के साथ एक अलग समूह अन्य टेम्पलेट्स के अनुसार माप हैं। तीसरा पुराने कोड में एक सरणी पैटर्न है। इसे थोड़ा ठीक किया जाना था ताकि कोई निहित चर ("~ it: val: i" न हो, न कि "@it :: i")। शायद इसीलिए यह थोड़ा धीमा है, छोटे पैटर्न में 10% है। अन्य विशेषताएं दिखाई दे रही हैं:
4) वस्तुओं के लिए दुभाषिया 3-5% तक सरणियों के लिए दुभाषिया की तुलना में धीमा है;
5) दोनों का निष्पादन अन्य आयामों के सापेक्ष तेज था, और व्याख्या 2-3 गुना धीमी थी; लंबा टेम्पलेट, धीमा;
6) सरणियों में पुराना कोड वस्तुओं में नए कोड की तुलना में तेज नहीं है - तेजी से संकेतित 3-5% केवल सरणियों में नया कोड। (यह प्रभाव संकलन कोड को फिर से लिखने से प्राप्त होता है - "+ = 1" के बजाय "++" का उपयोग करें।)
7) टेम्प्लेट्स की गति और नोटरी पर कार्य की गति (समय पर) ब्राउज़र के पुनरारंभ पर निर्भर करती है। परीक्षण पृष्ठ के कुछ समय बाद शुरुआत में वस्तुओं पर छोरों की तुलना में छोरों पर 20% और 5% से अधिक तेज होते हैं। शायद यह न केवल फ़ंक्शन का प्रभाव है, बल्कि परीक्षण वातावरण (क्रोम 32 बिट, विन में परीक्षण) का प्रभाव भी है।
हमें इस सवाल का जवाब मिला कि क्या कोड खराब हो गया है। सामान्य तौर पर, इसे अपने काम को पुराने कोड के काम के समान बनाने के लिए और सुधार की आवश्यकता नहीं होती है। मौजूदा परियोजनाओं में नए के साथ पुराने को बदलना संभव है। भले ही प्रश्न में संकलन या निष्पादन की गति शामिल हो।
एक बार फिर, यह आपको याद दिलाने के लिए चोट नहीं करता है : व्याख्या (परीक्षण देखें) संकलित टेम्पलेट्स के निष्पादन की तुलना में बहुत धीमी है। यदि प्रोजेक्ट गति में कहीं महत्वपूर्ण है और एक से अधिक टेम्पलेट निष्पादन हैं, तो एक अलग संकलन (doT.compile ()) का उपयोग करें।
टेम्पलेट इंजन को आगे हैक करें?
यदि वर्णित समाधान पुराने कोड के लिए कुछ भी नहीं बदलने के रूप में फ़ंक्शंस के सावधानीपूर्वक विस्तार के लिए अच्छी तरह से अनुकूल है, बस एक नया पुनरावृत्ति जोड़ने वाला है, तो नई परियोजनाओं के लिए आप तुरंत उस विकल्प का उपयोग कर सकते हैं जिसमें एरे पर लूप को एक सार्वभौमिक फॉर-इन लूप से बदल दिया जाता है और सरणी पर लूप होता है। फिल्टर अभिव्यक्ति गयी। दो प्रकार के पुनरावृत्तियों को व्यावहारिक रूप से एक में संयोजित किया जाता है, और व्यावहारिक रूप से पार्सिंग गति को नुकसान नहीं होता है, साथ ही साथ चक्र की गति भी। साइड इफेक्ट्स हो सकते हैं, इसलिए किसी मौजूदा प्रोजेक्ट में दूसरे विकल्प के लिए प्रतिस्थापन का परीक्षण करना अच्छा होगा यह निर्धारित करने के लिए कि क्या गलत टेम्पलेट के साथ कोई असामान्य स्थिति है। चक्र बदल रहे हैं, जिसका अर्थ है कि त्रुटियों से साइड इफेक्ट बदल रहे हैं।
कुछ पुराने ब्राउज़रों के लिए सरणी पर ओवर-इन लूप के लिए, आपको यह सुनिश्चित करने की आवश्यकता है कि पुनरावृत्त केवल संख्यात्मक अनुक्रमित पर काम करता है और पुनरावृत्ति में लंबाई की संपत्ति पर कब्जा नहीं करता है। आवश्यकता पूरी तरह से मौजूदा लूप फ़िल्टरिंग तंत्र द्वारा पूरी की जाती है, इसलिए यह केवल सही जांच लिखने के लिए रहता है यदि ऑब्जेक्ट एक सरणी हो। इस तरह का सत्यापन तर्कों या विशेषताओं जैसे संग्रह के लिए अति-उपयोगी नहीं होगा। और निश्चित रूप से अति-उपयोगी नहीं है - उन वस्तुओं के लिए जो सरणी के गुणों को प्राप्त करते हैं। केवल संख्यात्मक सूचकांकों के आधार पर ऐरे-आधारित ऑब्जेक्ट डिफ़ॉल्ट रूप से पुनरावृति करेंगे।
हालाँकि, यह थोड़ा अलग काम है। इस लेख में, हम खुद को एक सतर्क विस्तार तक सीमित रखते हैं, जिसका परीक्षण किया जाता है और एक परियोजना पर काम करता है।
परिणाम
हमने ऑब्जेक्ट पर पुनरावृत्ति की संभावना के लिए doT.js टेम्प्लेट इंजन के अतिरिक्त की जांच की, ताकि एक एक्सटेंशन प्राप्त किया जा सके जो मौजूदा संस्करण के अन्य गुणों का उल्लंघन नहीं करता है।
हम प्राप्त किया:
1) किसी भी स्थिति के अनुसार कुछ तत्वों को फ़िल्टर करने की क्षमता के साथ वस्तुओं ({{@ ...}}) टेम्पलेट में पुनरावृत्ति;
2) इट्रेटर हेडर के अंत में अप्रयुक्त मापदंडों और कॉलनों को निर्दिष्ट नहीं करने की क्षमता;
3) सरणियों पर चलने वाले के लिए, एक समान क्षमता को जोड़ा गया है ताकि सरणियों पर हेडर के हेडर में मापदंडों को निर्दिष्ट न किया जा सके;
4) पुराने संस्करण की तुलना में टेम्प्लेट इंजन के काम में गति का कोई नुकसान नहीं है (अन्य टेम्प्लेट पर एक तुच्छ नुकसान है);
5) छोटा संस्करण - 250 बाइट्स अधिक, और छोटे टेम्पलेट्स पर यह थोड़ा तेज काम करता है;
6) लंबे टेम्पलेट पर, नया संस्करण पूर्ण चक्र (संकलन + निष्पादन) के साथ 3% तेज है।
खनन के बारे में। परिणामों को हाथ से ठीक किया जाना चाहिए - चर "वैश्विक" और "डीओटी" को पुनर्स्थापित करने के लिए ताकि सब कुछ सही ढंग से काम करे। यह लेखक के गितुब पर मिनिफाई किए गए संस्करण 1.0.1 में नहीं किया गया था, इसलिए यह बिल्कुल असम्पीडित की तरह काम नहीं करता है (वैश्विक वातावरण में यह नहीं दिखता है)।
गिटहब शाखा में ले लो;
जाँच करने के लिए jsFiddle ।