2009-08-11 14 views
15

एक्शनस्क्रिप्ट 3 में, क्या स्वतंत्र पैकेज बनाने के विरुद्ध एक पूर्ण पैकेज आयात करने के बीच कोई रील ओवरहेड है?एक्शनस्क्रिप्ट 3 आयात पैकेज। * बनाम आयात पैकेज। क्लास

उदाहरण के लिए:। आयात flash.display * बनाम आयात flash.display.Sprite

मैं जानता हूँ कि यह एक पैकेज संघर्ष से बचने के से केवल जरूरत वर्गों आयात करने के लिए एक अच्छा अभ्यास है, लेकिन मैं अक्सर कहा गया है यह संकलित फ़ाइल आकार की अवधि में भी लागत है यदि मैं कई अलग-अलग वर्गों में पूर्ण पैकेज आयात करता हूं जो केवल उन संकुलों में से कुछ वर्गों का उपयोग करते हैं।

मुझे आश्चर्य है अगर एक वर्ग पूरी परियोजना के लिए सभी के लिए एक बार आयात किया जाएगा, या आयात वर्गों है कि उन्हें इस्तेमाल में गुणा कर रहे हैं।

दो अलग-अलग पहलू इस सवाल को गले लगाती है संकलित परिणामी फ़ाइल आकार और क्रम प्रदर्शन कर रहे हैं।

उत्तर

7

एकमात्र हिट संकलन समय होना चाहिए, लेकिन rday लिखता है कि वहां एक छोटी हिट है। लेकिन यह ऐसा कुछ होना चाहिए जो भविष्य में एडोब ठीक करे।

आयात बयान नहीं वास्तव में वास्तविक आयात पर देखा जाना चाहिए, यह केवल के लिए संकलक पता करने के लिए जो कक्षाएं आप की बात कर रहे हैं एक तरीका है।

उदाहरण के लिए। यदि आपने Point कक्षा बनाई है और इसका उपयोग किसी अन्य पैकेज में किया जा रहा है, तो संकलक को यह जानने की आवश्यकता है कि क्या आप अपने Point कक्षा या एडोब Point कक्षा में प्रतिक्रिया दे रहे हैं।

विकल्प पूरी तरह से योग्य नाम लिखने के evertime आप एक वर्ग में संदर्भित किया जाएगा।

उदाहरण के लिए। var mySprite:flash.display.Sprite = new flash.display.Sprite();

के रूप में टिप्पणी में जुआन पाब्लो Califano से कहा, यह वास्तव में संकलक के साथ काम नहीं करता है (हालांकि मुझे लगता है कि यह AS2 के साथ काम कर सकते हैं)। मैं केवल यह इंगित करना चाहता था कि हमारे पास शुरू करने के लिए आयात विवरण क्यों है।

किसी भी मामले में यह संकलित फ़ाइल को प्रभावित नहीं करना चाहिए अगर आप एक पूरे पैकेज आयात (हालांकि यह apperently करता है)।यह संकलन समय को कभी भी कैसे प्रभावित करेगा, क्योंकि आप कंपाइलर को अधिक सामान देने के लिए आवश्यक हैं।

एक ही कक्षा को एक से अधिक बार "आयात" करने के लिए। इससे कोई फर्क नहीं पड़ता। कंपाइलर में केवल एक ही कक्षा शामिल होगी। अन्यथा संकलित फ़ाइल का आकार जल्दी से नियंत्रण से बाहर हो जाएगा, क्योंकि अधिकांश कक्षाएं कई कक्षाओं को संदर्भित करती हैं जो फिर से दूसरों को संदर्भित करती हैं। लेकिन फिर से, एडोब वहां करने के लिए अनुकूलन कर सकता है।

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

एक तरफ ध्यान दें, यदि आप एक लाइब्रेरी संकलित कर रहे हैं (जहां एक कक्षा को शामिल नहीं किया गया है), तो मुझे यकीन नहीं है कि बाहरी पैकेज आयात करने में आपके द्वारा संकलित फ़ाइल शामिल हो सकती है। इसका वास्तविक असर हो सकता है; हालांकि उम्मीद है कि एडोब वहाँ पेंच नहीं था;)

+1

बस एक नोट: भले ही आप अपने कोड में पूरी तरह से योग्य पथ का उपयोग करते हैं, आपको आयात की आवश्यकता है या अन्यथा संकलक शिकायत करेगा। –

+0

सच है, मैं इसे भूल गया। लेकिन यह एक बिंदु के रूप में अधिक मतलब था कि क्यों हमारे पास आयात विवरण हैं, क्योंकि विकल्प बहुत परेशान होगा। –

+0

कोई समस्या नहीं है। और हाँ, यह एएस 2 में व्यवहार था। यदि आपने पूरी तरह से योग्य नाम का उपयोग किया है, तो आप आयात को छोड़ सकते हैं। –

0

सबसे अधिक भाषाओं के साथ के रूप में वहाँ बहुत कम या कोई प्रदर्शन अलग-अलग वर्गों के बजाय पूरे पैकेज का आयात से संबंधित भूमि के ऊपर है।

हालांकि इसे और अधिक एक अच्छा अभ्यास है, क्योंकि यह आपके वर्ग

1

ActionScript 3 spec का कहना है अगर आप का उपयोग पैकेज से सभी सार्वजनिक नाम आयातित '*' के लिए एक और अधिक संक्षिप्त निर्भरता veiw देता है। तो एक हिट है, हालांकि यह पैकेज आकार के आधार पर एक बड़ा नहीं हो सकता है। ActionScript Design Patterns पुस्तक अतिरिक्त सामान के साथ-साथ कुछ Adobe ActionScript tips के कारण भी इसे हतोत्साहित करती है।

कहा जा रहा है, मैं एक घटक के रूप में एक ऐप्लिकेशन मैंने लिखा और

import mx.containers.*; 
    import mx.events.*; 
    import mx.managers.*; 
एकल वर्ग के नाम के बजाय

में ले लिया। मेरा आकार 3 बाइट्स से बढ़ गया। अब, पूरा ऐप 935 केबी है, इसलिए शायद मुझे उन वर्गों को कहीं और आयात किया गया है, और हिट बहुत बड़ी नहीं थी। मैं शर्त लगाता हूं कि आपका आवेदन छोटा है, आपके संकलन आकार पर जितना बड़ा प्रभाव होगा (प्रतिशतानुसार)।

+0

थोड़ा निराशाजनक है कि संकलक इसे अनुकूलित नहीं कर सकता है। –

+0

लेकिन मुझे लगता है कि अधिक अनुकूलन का मतलब संकलन (प्रकाशित) करने के लिए अधिक समय है, फ्लैश एएस 3 प्रकाशित प्रक्रिया में पेटी से धीमा है। तो मेरी राय में, सबसे पहले उन्हें इसे बेहतर बनाना चाहिए (उच्च भाषाओं की तरह कुछ, केवल डेल्टा संकलित करें) और तेज़ी से उन्हें इन अनुकूलन के बारे में सोचना चाहिए। !!! :) – DexTer

0

अच्छा अभ्यास कोड है कि पढ़ी जा सकती है के लिए सामान्य रूप में है ... 200 आयात बयान के साथ एक वर्ग शुरू होने इस प्रकार नहीं बल्कि बुरा व्यवहार किया जाएगा ...

में एएस 3, एक आयात कथन केवल कंपाइलर के पहचानकर्ता संकल्प के लिए एक नया दायरा जोड़ता है ... एक एसडब्ल्यूएफ में संकलित किया गया है और क्या नहीं है, आयात विवरणों द्वारा निर्धारित नहीं किया जाता है, लेकिन वास्तविक निर्भरता, यानी कक्षा बी का उपयोग कक्षा ए से कोड ...

तो रनटाइम पर यह कोई फर्क नहीं पड़ता है, आपने अपनी कक्षाओं को कैसे आयात किया है ...

greetz

back2dos

+0

+1। मैं व्यक्तिगत रूप से प्रत्येक वर्ग को स्पष्ट रूप से आयात करना पसंद करता हूं। हालांकि, मुझे इसे दो बार लगता है अगर मुझे मैन्युअल रूप से ऐसा करना पड़ा, हालांकि। लेकिन, वैसे भी, आप इस बारे में सही हैं कि आयात कैसे काम करता है। यह एक कंपाइलर निर्देश है, लेकिन यह संकलन को मजबूर नहीं करता है। अन्यथा, कोई भी "var dummy: someClass;" का उपयोग क्यों करेगा कोड में शामिल संदर्भित कक्षा के समावेशन को मजबूर करने के लिए हैक? –

1

इसमें संकलित कोड में कोई अंतर नहीं है कि क्या आप पूरे पैकेज या सिर्फ कक्षाएं आप उपयोग कर रहे आयात है। संकलक के लिए कक्षाएं कहां मिलती हैं, यह आयात करना महत्वपूर्ण है।

आप पहले और बाद में बाइटकोड को हटाने या देखने की कोशिश कर सकते हैं।

1

आप देख सकते हैं कि वास्तव में क्या वर्गों 'link-report' compiler option

संकलक का उपयोग कर सुलझाने के लिए क्या शामिल करने के लिए और क्या शामिल करने के लिए नहीं अधिक समय लग सकता द्वारा आयात किए जा रहे हैं, लेकिन अगर आप अपने लिंक रिपोर्ट की जाँच के लिए, आप ध्यान दें कि इसमें केवल वह शामिल है जो इसका उपयोग करता है। :)

5

ryanday के अंक को संबोधित करते हुए मैं अतिरिक्त 3 बाइट्स, लेकिन कुछ नोट व्याख्या नहीं कर सकते ...

अतिरिक्त सामान की वजह से ActionScript डिजाइन पैटर्न पुस्तक भी इस हतोत्साहित

हाँ, पेज 115 पर, लेकिन मुझे लगता है कि यह गलत है और उस प्रभाव को इरेटा सबमिट किया गया है।

एक्शनस्क्रिप्ट 3 spec का कहना है कि यदि आप '*' का उपयोग करते हैं तो पैकेज से सभी सार्वजनिक नाम आयात किए जाएंगे। तो एक हिट है,

ऐसा लगता है, लेकिन मैं व्याख्या और हिट से असहमत हूं। यह कहता है: "पैकेज सदस्यों के नाम दृश्यमान ..." (in full) बनाये गये हैं।इस संदर्भ में, यह कंपाइलर और एडिटर टूल्स के सदस्यों को दृश्य के नाम बनाने का जिक्र कर रहा है, संकलित एसडब्ल्यूएफ के भीतर दिखाई नहीं दे रहा है। यानी का मतलब वर्गों को एसडब्ल्यूएफ में संकलित नहीं किया जाता है - जब तक वे वास्तव में उपयोग नहीं किए जाते हैं (उस प्रकार का एक चर घोषित किया जाता है)।

इसे देखने का एक और तरीका, आप मैन्युअल रूप से flash.display.MovieClip आयात कर सकते हैं। लेकिन अगर आप मूवीक्लिप का कोई उदाहरण नहीं बनाते हैं, तो मूवीक्लिप क्लास अंतिम एसडब्ल्यूएफ में संकलित नहीं होगा।

अपने आप को संतुष्ट करने के लिए, मैं के रूप में @secoif ने सुझाव दिया 3 तरीके में निम्नलिखित HelloWorld संकलित, outputting लिंक रिपोर्ट ...

package 
{ 
    import flash.display.Sprite; 
    import flash.text.TextField; 

    public class ASHelloWorld extends Sprite 
    { 
     public function ASHelloWorld() 
     { 
      var tf:TextField = new TextField(); 
      tf.text = "Hello World!"; 
      addChild(tf); 
     } 
    } 
} 

पहले, लिखा के रूप में, लिंक की रिपोर्ट:

<report> 
    <scripts> 
    <script name="~/Documents/eclipse3.5carbonFbPlugin-FX4-LS10/ASHelloWorld/src/ASHelloWorld.as" mod="1278415735000" size="682" optimizedsize="344"> 
     <def id="ASHelloWorld" /> 
     <pre id="flash.display:Sprite" /> 
     <dep id="AS3" /> 
     <dep id="flash.text:TextField" /> 
    </script> 
    </scripts> 
    <external-defs> 
    <ext id="AS3" /> 
    <ext id="flash.text:TextField" /> 
    <ext id="flash.display:Sprite" /> 
    </external-defs> 
</report> 

दूसरा, लिंक रिपोर्ट फ़ाइल को नष्ट करने के लिए और आयात बदलने के लिए:

import flash.display.MovieClip; 
    import flash.display.Sprite; 
    import flash.text.TextField; 

स्वच्छ निर्माण, और लिंक repor टी बिल्कुल वही दिखता है। वही आकार, वही अनुकूलित, समान लिंक किए गए वर्ग।

तीसरा, लिंक रिपोर्ट फ़ाइल को नष्ट करने के लिए और आयात बदलने के लिए:

import flash.display.*; 
    import flash.text.*; 

स्वच्छ निर्माण, और लिंक रिपोर्ट बिल्कुल वैसा ही लग रहा है। वही आकार, वही अनुकूलित, समान लिंक किए गए वर्ग।

केवल स्प्राइट और टेक्स्टफिल्ड कक्षाएं प्रत्येक मामले में इसे एसडब्ल्यूएफ में बनाती हैं।

डिस्क पर वास्तविक एसडब्ल्यूएफ फ़ाइल आकार को देखते हुए, 3 संस्करणों पर मामूली (1 या 2 बाइट) भिन्नता प्रतीत होती है। रायडय के पद में निर्दिष्ट बड़े एसडब्ल्यूएफ के मुकाबले कोई भी बुरा नहीं।

0

मैंने एएस 3 की तुलना में खोज की, केवल आयात विवरणों का उपयोग करने से आपके आउटपुट में कक्षाएं शामिल होंगी, भले ही उन वर्गों को वास्तविक कोड में संदर्भित किया गया हो। जावा के खिलाफ इसकी तुलना करें जिसमें केवल कक्षाओं को शामिल किया जाएगा यदि वे वास्तव में उपयोग किए जाते हैं, न केवल आयात विवरणों में उल्लेख किया गया है। लेकिन फ्लैश एपीआई को डिजाइन करते समय मुझे यह उपयोगी लगता है, आयात बयान में उन वर्गों का जिक्र करें और उन्हें शामिल किया जाएगा।

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