2011-03-24 9 views
7
function A() { 
    function B() { 
      ... 
    }   
    B(); 
} 

कार्य B हर बार बनाया गया है A कहा जाता है या उस पर कुछ कैशिंग है। इसे स्थानीय बना नहीं रहा है:क्या स्थानीय फ़ंक्शन घोषणाएं कैश की गई हैं?

function A() { 
    B(); 
} 
function B() { 
    ... 
} 

एक महत्वपूर्ण प्रदर्शन सुधार?

क्या यह एक स्टाइल पसंद करने के लिए मान्य है? (B इस मामले में A के लिए एक सहायक कार्य है।) या दूसरे को गति के लिए अनुकूल होना चाहिए?

क्या इस शैली का उपयोग किया जाना चाहिए या पठनीयता के लिए टालना चाहिए?

Benchmark

स्थानीय मामले के लिए FF4 inlines B की तरह लगता है और समारोह कॉल उपरि निकाल देता है।

अन्य ब्राउज़रों के बारे में क्या?

+0

किसी अन्य के अंदर एक फ़ंक्शन घोषित करना बुरा है। आपके पहले उदाहरण बी() में एक अभिव्यक्ति होनी चाहिए थी। यहां देखें: http://stackoverflow.com/questions/1013385/what-is-the-difference-between-a-function-expression-vs-declaration-in-javascript – DanMan

+1

ऐसा लगता है कि आपका परीक्षण केस सही नहीं है; आप वास्तव में कार्यों को निष्पादित नहीं कर रहे हैं, बस उन्हें घोषित कर रहे हैं। चेकआउट http://jsperf.com/inner- कार्यक्षमता- अनुकूलन। क्रोम अनुकूलित करने के लिए प्रतीत नहीं होता है। मुझे संदेह है कि कोई इंजन होगा। – Matt

+0

@ मैट ओह .. मैं उन्हें फोन करना भूल गया। कितना बेवकूफ :( – Raynos

उत्तर

4

जे एस में एक आंतरिक समारोह की घोषणा की lexically बाहरी समारोह के स्थानीय चर/तर्क करने के लिए बाध्य किया जा रहा उद्देश्य हो सकता है। इसे शीर्ष-स्तरीय फ़ंक्शन के रूप में स्थानांतरित करना उस उद्देश्य को हरा देता है।

प्रश्न का उत्तर देने के लिए: हाँ, आंतरिक कार्य कम से कम सिद्धांत में हर बार बनाया जाता है, और कोड लिखते समय आपको इसे देखना चाहिए, लेकिन एक स्मार्ट ऑप्टिमाइज़र अभी भी इसे शीर्ष-स्तर पर परिवर्तित कर सकता है कार्य, भले ही आपके पास शब्दावली निर्भरताएं हों। यदि यह एक माइक्रो-ऑप्टिमाइज़ेशन है, तो मैं परेशान नहीं होता क्योंकि आंतरिक कार्य होने से पठनीयता के उद्देश्य और आपके इरादों को घोषित किया जाता है।

0

Raynos, मैं अपने jsperf परीक्षण को देखा है, और आप समारोह घोषणा, नहीं समारोह निष्पादन परीक्षण कर रहे हैं जैसे कि यह लग रहा है।

नीचे दिए गए लिंक को देखें। क्या यह सहायक है?

Another benchmark

मुझे लगता है कि कहेंगे:

  1. अपने नमूना कोड में, बी हर बार एक शुरू हो जाती है बन जाता है। (मेरे नमूना ऊपर से जुड़ा हुआ है, बाहरी साधारण परीक्षण देखें।)

  2. प्रतिशत के लिहाज से, प्रदर्शन में सुधार महत्वपूर्ण है। लेकिन, यदि वास्तविक दुनिया का कार्य microseconds में चलता है, तो आप एक अंतर नहीं देख सकते हैं।

  3. एक और विचार यह है कि बी (सहायक कार्य) के लिए "निजी" होना चाहिए (दूसरे शब्दों में, केवल ए के अंदर दिखाई देता है)। मध्य-के-द-रोड विकल्प के लिए मेरे लिंक में बाहरी तत्काल फ़ंक्शन देखें।

+0

यह एक दयालु ब्राउज़र है जो इसे कैशिंग के साथ अनुकूलित नहीं करता है। – Raynos

0

यह अजीब बात है, क्योंकि मुझे लगता है कि हर बार एक समारोह को फिर से घोषित करने से निष्पादन समय धीमा हो जाएगा।

क्या किसी के पास इसका जवाब है?

एकमात्र समाधान मैं के साथ आ सकता है कि समारोह सी, यह गुंजाइश है छोड़ने के लिए, वैश्विक एक के लिए ऊपर ले जाने के समारोह डी निष्पादित, तो वापस जाने के लिए है। जबकि कार्य ए निष्पादन के माध्यम से एक गुंजाइश के भीतर रहता है। कोई विचार?

+0

यह निष्पादन समय धीमा कर देता है, मेरे बेंचमार्क ने फ़ंक्शन को कॉल नहीं किया था। – Raynos