दिलचस्प पोस्ट
उपप्रक्रिया का उपयोग करके अजगर स्क्रिप्ट में इनपुट के साथ अजगर स्क्रिप्ट को कॉल करें jqGrid Chrome / Chrome Frame में सही ढंग से रेंडर नहीं करता है डाइजेक्ट ट्रिगर के बाद mysql जो किसी अन्य तालिका के कॉलम को अपडेट करता है एंड्रॉइड में एक्सेस संसाधन फाइलें पीएचपी के साथ HTTP POST का उपयोग करते हुए XML डेटा भेजना एंड्रॉइड में साझाभाषा का उपयोग करके मैं छवियों को कैसे स्टोर कर सकता हूं? Git repository (इतिहास) से फ़ाइल निकालें जावा: सिंटैक्स और अर्थ "? बाइनरी / पता? Jython के साथ मेरी पायथन स्क्रिप्ट JAR फ़ाइलों को वितरित करना? डिक्ट कुंजियों को एक विशेषता की तरह एक्सेस करना? बॉट्स पर हमला! PHP में वजन से यादृच्छिक परिणाम उत्पन्न करना? नए तत्वों का निर्माण करने के लिए उत्परिवर्तन पर्यवेक्षक क्यों StyleCop "यह" के साथ विधि या गुण कॉल prefixing सिफारिश करता है? स्पार्क java.lang.OutOfMemoryError: जावा हीप स्पेस

वेतन वृद्धि के बाद पूर्व वृद्धि – जावास्क्रिप्ट अनुकूलन

मैं Google Code ब्राउज़ कर रहा था जब मैंने जेएसपीएड – जावास्क्रिप्ट के लिए ऑप्टिमाइज़ेशन नामक इस प्रोजेक्ट पर ध्यान दिया।

मैंने देखा कि ऑप्टिमाइज़ेशन में से एक में i++ टू ++i इन लूप स्टेटमेंट्स को बदलना था।

अनुकूलन से पहले

 for (i=0;i<1;i++) {} for (var i = 0, j = 0; i < 1000000; i++, j++) { if (i == 4) { var tmp = i / 2; } if ((i % 2) == 0) { var tmp = i / 2; i++; } } var arr = new Array(1000000); for (i = 0; i < arr.length; i++) {} 

अनुकूलन के बाद

 for(var i=0;i<1;++i){} for(var i=0,j=0;i<1000000;++i,++j){if(i==4){var tmp=i>>1;} if((i&1)==0){var tmp=i>>1;i++;}} var arr=new Array(1000000);for(var i=0,arr_len=arr.length;i<arr_len;++i){} 

मुझे पता है कि वेतन पूर्व और बाद में क्या होता है, लेकिन किसी भी विचार से यह कैसे कोड को गति देता है?

वेब के समाधान से एकत्रित समाधान "वेतन वृद्धि के बाद पूर्व वृद्धि – जावास्क्रिप्ट अनुकूलन"

यह मैंने पढ़ा है और आपके प्रश्न का उत्तर दे सकता है: "प्रीइन्क्रिटमेंट ( ++i ) ++i एक के मूल्य को जोड़ता i , फिर i देता है; इसके विपरीत, i++ रिटर्न देता है तो i इसे एक जोड़ देता i , सिद्धांत में जिसके परिणामस्वरूप पैदा होता है वेतनमान आपरेशन लागू होने से पहले एक अस्थायी चर i के मूल्य भंडारण "।

यह एक गलत अनुकूलन है जहाँ तक मैं इसे समझता हूं, आप 1 सेशन कोड को सहेज रहे हैं। यदि आप इस तकनीक के साथ अपना कोड अनुकूलित करना चाहते हैं, तो आप गलत तरीके से चले गए हैं साथ ही, सबसे कंपाइलर्स / दुभाषियों को आपके लिए यह वैसे भी अनुकूल होगा ( संदर्भ 1 )। संक्षेप में मैं इसके बारे में चिंता नहीं करता। लेकिन , अगर आप वास्तव में चिंतित हैं, तो आपको i+=1 उपयोग करना चाहिए।

यहां मैंने बहुत ही तेज और गंदी बेंचमार्क किया है

 var MAX = 1000000, t=0,i=0; t = (new Date()).getTime(); for ( i=0; i<MAX;i++ ) {} t = (new Date()).getTime() - t; console.log(t); t = (new Date()).getTime(); for ( i=0; i<MAX;++i ) {} t = (new Date()).getTime() - t; console.log(t); t = (new Date()).getTime(); for ( i=0; i<MAX;i+=1 ) {} t = (new Date()).getTime() - t; console.log(t); 

कच्चे परिणाम

 Post Pre += 1071 1073 1060 1065 1048 1051 1070 1065 1060 1090 1070 1060 1070 1063 1068 1066 1060 1064 1053 1063 1054 

निम्नतम और उच्चतम निकाला गया

 Post Pre += 1071 ---- 1060 1065 ---- ---- 1070 1065 1060 ---- 1070 1060 1070 1063 ---- 1066 1060 1064 ---- 1063 1054 

औसत

 1068.4 1064.2 1059.6 

ध्यान दें कि यह एक लाख से अधिक पुनरावृत्तियों पर है और परिणाम 9 मिलीसेकेंड के औसत के भीतर हैं। वास्तव में बहुत अधिक ऑप्टिमाइज़ेशन नहीं है, क्योंकि जावास्क्रिप्ट में सबसे अधिक व्यावहारिक प्रसंस्करण बहुत छोटे सेटों (डोम कंटेनर उदाहरण के लिए) पर किया जाता है।

समय से पहले अनुकूलन की तरह लगता है जब आप लगभग अपना ऐप पूरा कर लेते हैं, तो जांच लें कि बाधाओं को कहाँ है और आवश्यकतानुसार अनुकूलित करें। लेकिन अगर आपको पाश प्रदर्शन के लिए एक संपूर्ण गाइड चाहिए, तो इसे देखें:

http://blogs.oracle.com/greimer/entry/best_way_to_code_a

लेकिन आपको कभी नहीं पता होगा कि जे एस इंजन के सुधार और ब्राउज़र के बीच भिन्नता के कारण यह अप्रचलित हो जाएगा। सबसे अच्छा विकल्प इसके बारे में चिंता करने की नहीं है जब तक कि यह समस्या नहीं है। अपना कोड पढ़ने के लिए स्पष्ट करें

संपादित करें: इस व्यक्ति के अनुसार पूर्व बनाम पोस्ट सांख्यिकीय रूप से नगण्य है। (पूर्व संभवतः खराब होने के साथ)

अनुकूलन पूर्व बनाम पोस्ट वृद्धि नहीं है यह बिटवर्थ 'शिफ्ट' और 'और' ऑपरेटर के बजाय विभाजन और मोड का उपयोग है

कुल आकार में कमी करने के लिए जावास्क्रिप्ट को कम करने का अनुकूलन भी है (लेकिन यह एक रनटाइम ऑप्टिमाइज़ेशन नहीं है)।

एनाटोली के परीक्षण में पूर्व-वेतन वृद्धि परीक्षण समारोह के अंदर एक वेतन वृद्धि शामिल थी 🙁

इस परिणाम के बिना परिणाम यहां दिए गए हैं …

 function test_post() { console.time('postIncrement'); var i = 1000000, x = 0; do x++; while(i--); console.timeEnd('postIncrement'); } function test_pre() { console.time('preIncrement'); var i = 1000000, x = 0; do ++x; while(--i); console.timeEnd('preIncrement'); } test_post(); test_pre(); test_post(); test_pre(); test_post(); test_pre(); test_post(); test_pre(); 

उत्पादन

 postIncrement: 3.21ms preIncrement: 2.4ms postIncrement: 3.03ms preIncrement: 2.3ms postIncrement: 2.53ms preIncrement: 1.93ms postIncrement: 2.54ms preIncrement: 1.9ms 

यह एक बड़ा अंतर है।

बस फायरबग में इसका परीक्षण किया और पोस्ट- और प्रीिनक्रीमेंट्स में कोई अंतर नहीं पाया। शायद यह अनुकूलन अन्य प्लेटफार्मों? फ़ायरबग परीक्षण के लिए मेरा कोड यहां है:

 function test_post() { console.time('postIncrement'); var i = 1000000, x = 0; do x++; while(i--); console.timeEnd('postIncrement'); } function test_pre() { console.time('preIncrement'); var i = 1000000, x = 0; do ++x; while(i--); console.timeEnd('preIncrement'); } test_post(); test_pre(); test_post(); test_pre(); test_post(); test_pre(); test_post(); test_pre(); 

आउटपुट है:

 postIncrement: 140ms preIncrement: 160ms postIncrement: 136ms preIncrement: 157ms postIncrement: 148ms preIncrement: 137ms postIncrement: 136ms preIncrement: 148ms 

यह शायद कार्गो-पंथी प्रोग्रामिंग है जब आप उन भाषाओं के लिए एक सभ्य संयोजक / दुभाषिए का उपयोग कर रहे हैं, जिनके मनमाना ऑपरेटर ओवरलोडिंग नहीं हैं, तो इससे कोई फर्क नहीं पड़ेगा।

यह अनुकूलन सी ++ के लिए समझ में आया

 T x = ...; ++x 

जगह में एक मूल्य को संशोधित कर सकता है जबकि

 T x = ...; x++ 

जैसे-जैसे- हुड के तहत कुछ करके एक प्रति बनाना होगा

 T x = ...; T copy; (copy = T(x), ++x, copy) 

जो कि बड़े प्रारूप प्रकारों के लिए या उनके `प्रतिलिपि कन्स्ट्रक्टर में बहुत से गणनाओं के लिए महंगा हो सकता है