जावास्क्रिप्ट दक्षता: 'फॉर' बनाम 'फॉरच' [बंद]


103

2017 में जावास्क्रिप्ट के साथ () छोरों के लिए वर्तमान मानक क्या है।

मैं वर्तमान में कोल्ट Steeles "वेब देव Bootcamp" Udemy पर के माध्यम से अपने रास्ते काम कर रहा हूँ और वह एहसान forEachसे अधिक forअपनी शिक्षाओं में। मैं है, हालांकि, विभिन्न चीजों के लिए अभ्यास के दौरान पाठ्यक्रम काम के हिस्से के रूप में खोज की है और मैं अधिक से अधिक सिफारिशें एक का उपयोग नहीं कर पाते forबजाय -loop forEach। ज्यादातर लोगों को लगता है कि लूप अधिक कुशल है।

क्या यह कुछ है जो पाठ्यक्रम लिखे जाने के बाद से बदल गया है (लगभग 2015) या प्रत्येक के लिए उनके वास्तव में पेशेवरों और विपक्ष हैं, जो कि अधिक अनुभव के साथ सीखेंगे।

किसी भी सलाह की काफी सराहना की जाएगी।


11
2017 के मानक के किसी व्यक्ति के व्यक्तिपरक विचार के लिए खुद को क्यों टाई? एक साफ-सुथरा मानक अपनाएं, जैसे कि साफ-सुथरा, रख-रखाव कोड लिखना, यह जानते हुए कि इंजीनियर सबसे अधिक इस्तेमाल किए जाने वाले निर्माणों को बहुत कुशल बनाने के लिए कड़ी मेहनत कर रहे हैं, और फिर प्रदर्शन के लिए अनुकूलन करते हैं जब आपके पास एक विशिष्ट प्रदर्शन समस्या होती है

2
एक देशी forशुद्ध गति के लिए हरा मुश्किल है। forEach()प्रत्येक पुनरावृत्ति के लिए कॉलबैक आमंत्रित करता है; इसलिए, यह स्पष्ट रूप से कुछ उपरि के साथ किया जाता है।
कैनन

1
एक डेवलपर होने के नाते मैं शायद ही या फोरचेक का उपयोग करता हूं, ज्यादातर काम नक्शे, फ़िल्टर या कम तरीकों से किया जाता है।
एटी

12
@ जब तक आप उन लोगों में से नहीं हैं, जो mapशुद्ध रूप से पुनरावृत्ति के लिए उपयोग करते हैं और नए सरणी को उत्पन्न करते हैं, को छोड़ देता है। मैं नहीं जानता कि कितने लोगों को मुझे अकेले इस साइट पर उस विशेष फ़ंक्शन पसंद पर सही करना पड़ा है।
कैनन

1
@ डकोन सहमत हुए, लूप का चयन महत्वपूर्ण है और किसी को चुनते समय ऐसे तरीकों के आउटपुट और अवशेषों को ध्यान में रखना चाहिए। मेरा मानना ​​है कि पठनीय मैदान "छोरों के लिए" से बचना चाहिए।
एटी

जवाबों:


199

के लिये

forछोरों बहुत अधिक कुशल हैं। यह एक लूपिंग निर्माण है जिसे विशेष रूप से पुनरावृति के लिए डिज़ाइन किया गया है, जबकि एक शर्त सही है , एक ही समय में एक स्टेपिंग तंत्र की पेशकश (आमतौर पर पुनरावृत्ति को बढ़ाने के लिए)। उदाहरण:

for (var i=0, n=arr.length; i < n; ++i ) {
   ...
}

यह पता चलता है कि नहीं है के लिए -loops हमेशा और अधिक कुशल हो जाएगा, सिर्फ इतना है कि जे एस इंजन और ब्राउज़र उन्हें अनुकूलित किया है तो हो सकता है। वर्षों से समझौता किया गया है कि कौन से लूपिंग निर्माण अधिक कुशल है (के लिए, जबकि, कम, रिवर्स-जबकि, आदि) - अलग-अलग ब्राउज़रों और जेएस इंजनों के अपने कार्यान्वयन हैं जो समान परिणाम उत्पन्न करने के लिए अलग-अलग कार्यप्रणालियों की पेशकश करते हैं। जैसा कि ब्राउज़र आगे प्रदर्शन मांगों को पूरा करने के लिए अनुकूलन करते हैं, सैद्धांतिक रूप [].forEachसे इस तरह से लागू किया जा सकता है कि यह तेजी से या एक के लिए तुलनीय है for

लाभ:

  • कुशल
  • प्रारंभिक लूप समाप्ति (सम्मान breakऔर continue)
  • स्थिति नियंत्रण ( i<nकुछ भी हो सकता है और किसी सरणी के आकार के लिए बाध्य नहीं)
  • वैरिएबल स्कूपिंग ( लूप समाप्त होने के बाद उपलब्ध var iपत्तियां i)

प्रत्येक के लिए

.forEachऐसी विधियाँ हैं जो मुख्य रूप से सरणियों पर पुनरावृति करती हैं (अन्य गणना योग्य, जैसे कि Mapऔर Setवस्तुओं पर)। वे नए हैं और कोड प्रदान करते हैं जो पढ़ने में आसान है। उदाहरण:

[].forEach((val, index)=>{
   ...
});

लाभ:

  • चर सेटअप शामिल नहीं है (सरणी के प्रत्येक तत्व पर iterates)
  • फ़ंक्शंस / एरो-फ़ंक्शंस चर को ब्लॉक
    में स्कोप करते हैं। ऊपर दिए गए उदाहरण valमें, नए बनाए गए फ़ंक्शन का एक पैरामीटर होगा। इस प्रकार, valलूप से पहले बुलाया जाने वाला कोई भी वैरिएबल समाप्त होने के बाद अपने मूल्यों को धारण करेगा।
  • विषयगत रूप से अधिक बनाए रखने योग्य है क्योंकि यह पहचानना आसान हो सकता है कि कोड क्या कर रहा है - यह एक असंख्य पर चलने वाला है; जबकि किसी भी लूपिंग योजनाओं के लिए एक लूप का उपयोग किया जा सकता है

प्रदर्शन

प्रदर्शन एक मुश्किल विषय है, जिसे आम तौर पर कुछ अनुभव की आवश्यकता होती है जब यह पूर्वविवेक या दृष्टिकोण पर आता है। समय से पहले निर्धारित करने के लिए (विकसित करते समय) कितना अनुकूलन की आवश्यकता हो सकती है, एक प्रोग्रामर को समस्या के मामले के साथ पिछले अनुभव का एक अच्छा विचार होना चाहिए, साथ ही संभावित समाधानों की अच्छी समझ भी होनी चाहिए।

कुछ मामलों में jQuery का उपयोग करना कई बार बहुत धीमा हो सकता है (एक अनुभवी डेवलपर यह जान सकता है), जबकि अन्य समय एक गैर-मुद्दा हो सकता है, जिस स्थिति में पुस्तकालय के क्रॉस-ब्राउज़र अनुपालन और अन्य कार्यों को करने में आसानी (जैसे, AJAX,) ईवेंट-हैंडलिंग) सहेजे गए विकास (और रखरखाव) के समय के लायक होगा।

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

पहुंच

यदि आपके पास एक अच्छी समझ नहीं है, तो किसी चीज को अनुकूलित कोड की आवश्यकता होगी, यह आम तौर पर बनाए रखने योग्य कोड लिखने के लिए अंगूठे का एक अच्छा नियम है। वहां से, आप परीक्षण कर सकते हैं और इंगित कर सकते हैं कि आवश्यकता होने पर अधिक ध्यान देने की आवश्यकता है।

उस ने कहा, कुछ स्पष्ट अनुकूलन सामान्य अभ्यास का हिस्सा होना चाहिए और किसी भी विचार की आवश्यकता नहीं होनी चाहिए। उदाहरण के लिए, निम्नलिखित लूप पर विचार करें:

for (var i=0; i < arr.length; ++i ){}

लूप के प्रत्येक पुनरावृत्ति के लिए, जावास्क्रिप्ट arr.lengthप्रत्येक चक्र पर एक कुंजी-लुकअप लागत संचालन को पुनः प्राप्त कर रहा है। ऐसा नहीं होने का कोई कारण नहीं है:

for (var i=0, n=arr.length; i < n; ++i){}

यह वही काम करता है, लेकिन केवल arr.lengthएक बार पुनर्प्राप्त करता है , चर को कैशिंग करता है और आपके कोड का अनुकूलन करता है।


25
उत्कृष्ट, पूरी तरह से, गैर-अभिमानपूर्ण उत्तर, समय, कार्यान्वयन या माइक्रो-बेंचमार्क परीक्षण में एक भी बिंदु के लिए बाध्य नहीं है।

1
बिल्कुल सही, यह वही है जो मैं देख रहा था और वीडियो की तुलना में बहुत अधिक गहराई देता है। मैं वास्तव में इसकी सराहना करता हूं, नया होना सीखने के लिए बहुत कुछ है और ये ऐसी चीजें हैं जो बिना किसी कारण के एक-दूसरे का पक्ष लेते हुए आसानी से छोड़ देती हैं जो भविष्य में आपके लिए बाधा बन सकती हैं। बहुत धन्यवाद!
tonyrobbins 19

2
फॉर-लूप में अक्सर डिबगिंग के संदर्भ में एक फायदा होता है: वे ट्राविला में कदम रखने, ब्रेकपॉइंट और निरीक्षण करने के लिए होते हैं। ForEach () के साथ अतिरिक्त कॉलबैक स्तर चीजों को थोड़ा जटिल कर सकता है।
एरिक ग्रेंज

1
@FelipeBuccioni धन्यवाद, मैं वास्तव में उस पर गौर करने जा रहा था जैसा कि मुझे लगता है कि इंजन अब जांचते हैं कि क्या लंबाई निर्धारित होने पर एक सरणी को निर्धारित करने के लिए उत्परिवर्तित किया जाएगा। हालांकि, विरासत के प्रयोजनों के लिए मुझे लगता है कि अनुकूलन इंजन उतना उदार नहीं थे और लंबाई प्रत्येक पुनरावृत्ति पर एक प्रदर्शन हिट थी। मैं आपके लेख पर नज़र
डालूँगा

6
मैं वास्तव में इस उत्तर और वाक्यांश में स्पष्टीकरण का आनंद लेता हूं [...], if performance and optimization was everything, there would be no other code than machine or assembly.। मेरा मानना ​​है कि letब्लॉक स्कोप लोकल वैरिएबल घोषित करने के स्टेटमेंट के साथ, लूप के forEachऊपर दूसरा फायदा नहीं है, forजब तक कि बिना सपोर्ट के माहौल में न हो let
user7393973
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.