2009-08-11 22 views
15

In Actionscript 3, esiste un sovraccarico della bobina tra l'importazione di un pacchetto completo e l'importazione di classi indipendenti?Pacchetto di importazione Actionscript 3. * vs pacchetto di importazione. Classe

esempio:. Import flash.display * vs. import flash.display.Sprite

Lo so che è una buona pratica di importare solo le classi necessarie da un pacchetto per evitare conflitti, ma mi hanno detto spesso ha anche un costo in termini di dimensioni del file compilato se importo pacchetti completi in molte classi diverse che usano solo alcune delle classi da quei pacchetti.

mi chiedo se una classe sarà importato una volta per tutte per l'intero progetto, o se le importazioni sono moltiplicati tra le classi che li utilizzano.

risultante compilato la dimensione del file e le prestazioni di runtime sono due aspetti diversi a questa domanda abbraccia.

risposta

7

L'unico risultato dovrebbe essere il tempo di compilazione, ma rday scrive che c'è un piccolo successo in modo apprezzabile. Ma quello dovrebbe essere qualcosa che Adobe risolverà in futuro.

Le dichiarazioni di importazione non dovrebbe davvero essere guardato come importazioni reali, si tratta semplicemente di un modo per il compilatore per sapere quali classi si sta riferendo a.

es. Se hai creato la tua classe Point ed è stata utilizzata in un altro pacchetto, il compilatore deve sapere se stai facendo riferimento alla tua classe Point o alla classe Adobe Point.

L'alternativa sarebbe quella di scrivere il nome completo evertime si riferisce a una classe.

es. var mySprite:flash.display.Sprite = new flash.display.Sprite();

Come sottolineato da Juan Pablo Califano nel commento, questo in realtà non funziona con il compilatore (anche se penso che potrebbe funzionare con AS2). Volevo solo sottolineare perché abbiamo una dichiarazione di importazione per cominciare.

In ogni caso non dovrebbe effettuare il file compilato se si importa un intero pacchetto (anche se lo fa apperently).Avrà sempre effetto sul tempo di compilazione, dato che stai dando al compilatore più cose di cui ha bisogno per guardare attraverso.

Come per "importare" la stessa classe più di una volta. Non farà la differenza. Il compilatore includerà solo la stessa classe una volta. Altrimenti le dimensioni del file compilato verrebbero rapidamente fuori controllo, dal momento che la maggior parte delle classi fa riferimento a molte classi che si riferiscono ancora ad altre ecc. Ma ancora una volta, Adobe potrebbe avere l'ottimizzazione per farlo.

In conclusione, dovresti importare solo le cose che ti servono, non c'è alcun reale vantaggio nell'importare un intero pacchetto. Basta usare uno strumento di codifica adeguato come FlashDevelop (è gratuito) e non è nemmeno necessario scrivere le istruzioni di importazione da soli.

Nota a margine, se si sta compilando una libreria (in cui è inclusa anche una classe non indicata), non sono sicuro che l'importazione di un pacchetto esterno possa includere quella nel file compilato. Ciò potrebbe avere un impatto reale; anche se si spera di Adobe non rovinare c'è;)

+1

Solo una nota: anche se si utilizza il percorso completo del codice, è necessario importarlo altrimenti il ​​compilatore si lamenterà. –

+0

Vero, l'ho dimenticato. Ma era più inteso come un motivo per cui abbiamo le dichiarazioni di importazione, dal momento che l'alternativa sarebbe molto fastidiosa. –

+0

Nessun problema. E sì, quello era il comportamento in AS 2. Se hai usato il nome completo, potresti omettere l'importazione. –

0

Come con la maggior parte delle lingue non v'è poca o nessuna overhead delle prestazioni relative a importare interi pacchetti piuttosto che singole classi.

tuttavia è più una buona pratica in quanto dà una magnifica vista molto più conciso delle dipendenze per la classe

1

Il ActionScript 3 spec dice tutti i nomi pubblici dal pacchetto sarà importata se si utilizza il '*'. Quindi c'è un successo, anche se potrebbe non essere grande a seconda delle dimensioni del pacchetto. Il libro ActionScript Design Patterns scoraggia anche questo a causa del bagaglio in eccesso, così come alcuni Adobe ActionScript tips.

Detto questo, ho preso uno come componente di un app che ho scritto e

import mx.containers.*; 
    import mx.events.*; 
    import mx.managers.*; 

Al posto dei nomi delle classi singole. Le mie dimensioni sono aumentate di 3 byte. Ora, l'intera app è 935kB, quindi probabilmente ho importato quelle classi altrove, e il successo non è stato molto grande. Scommetto che più piccola è la tua applicazione, maggiore sarà l'impatto sulla dimensione della compilazione (in termini percentuali).

+0

Un po 'deludente che il compilatore non possa ottimizzarlo. –

+0

Ma penso che più ottimizzazione significhi più tempo per compilare (pubblicare), Flash AS3 è pateticamente lento nel processo di pubblicazione. Quindi, a mio parere, in primo luogo dovrebbero renderlo migliore (qualcosa come lingue più alte, compilare solo delta) e più velocemente poi dovrebbero pensare a queste ottimizzazioni. !!! :) – DexTer

0

buona pratica è, in generale, di avere il codice che è leggibile ... avere un inizio di classe con 200 istruzioni di importazione in tal modo sarebbe piuttosto cattiva pratica ...

in as3, un'istruzione import aggiunge solo un nuovo scope alla risoluzione dell'identificatore del compilatore ... ciò che è compilato in un file SWF e cosa non lo è, non è determinato dalle istruzioni di importazione, ma da dipendenze reali, cioè codice dalla classe A che utilizza la classe B ...

quindi in fase di esecuzione non fa alcuna differenza, come è importato le classi ...

greetz

back2dos

+0

+1. Personalmente mi piace importare esplicitamente ogni classe. Ci penserei due volte se dovessi farlo manualmente, però. Ma, comunque, hai ragione su come funziona l'importazione. È una direttiva del compilatore, ma non impone la compilazione. Altrimenti, perché qualcuno dovrebbe usare "var dummy: SomeClass;" hackerare per forzare l'inclusione di una classe non referenziata come tale nel codice? –

1

Non c'è assolutamente nessuna differenza nel codice compilato se si importa l'intero pacchetto o solo le classi che si sta utilizzando. Le importazioni sono solo importanti per il compilatore per trovare dove sono le classi.

Si può provare a decompilare o guardare il bytecode prima e dopo.

1

È possibile controllare esattamente quali classi vengono importati usando il 'link-report' compiler option

il compilatore può richiedere più tempo per risolvere cosa includere e cosa non includere, ma se si estrae i vostri rapporti di collegamento, si notare che include solo ciò che utilizza. :)

5

Rivolgendosi punti di ryanday, non riesco a spiegare le ulteriori 3 byte, ma alcune note ...

Il libro di modelli di ActionScript design scoraggia anche questo a causa di bagaglio in eccesso

Sì, a pagina 115, ma penso che sia sbagliato e inviato errata in tal senso.

La specifica ActionScript 3 dice che tutti i nomi pubblici del pacchetto verranno importati se si utilizza il '*'. Quindi c'è un successo,

In un certo senso, ma non sono d'accordo sull'interpretazione e colpisco. Dice: "I nomi dei membri del pacchetto sono resi visibili ..." (in full).In questo contesto, si riferisce al fatto di rendere i nomi dei membri visibili allo agli strumenti del compilatore e dell'editor, non visibili all'interno del file SWF compilato. Ad esempio, non significa che le classi vengono compilate nel file SWF, a meno che non vengano effettivamente utilizzate (una variabile dichiarata di quel tipo).

Un altro modo di osservare questo, è possibile importare manualmente flash.display.MovieClip. Ma se non crei alcuna istanza di MovieClip, la classe MovieClip non verrà compilata nel file SWF finale.

Per soddisfare me stesso, ho compilato il seguente helloworld in 3 modi, l'output link-rapporto come suggerito da @secoif ...

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); 
     } 
    } 
} 

In primo luogo, come scritto, rapporto link:

<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> 

In secondo luogo, eliminare il file di report di collegamento e cambiare le importazioni:

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

Clean costruire, e il link rELAZIONE t sembra esattamente lo stesso Stessa dimensione, stessa ottimizzazione, stesse classi collegate.

In terzo luogo, eliminare il file di report di collegamento e cambiare le importazioni a:

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

Clean costruzione, e la relazione di collegamento sembra esattamente lo stesso. Stessa dimensione, stessa ottimizzazione, stesse classi collegate.

Solo le classi Sprite e TextField fanno in ogni caso il file SWF.

Osservando le dimensioni effettive del file SWF su disco, sembra esserci una leggera variazione (1 o 2 byte) rispetto alle 3 versioni. Niente di peggio che per il più grande SWF cui si fa riferimento nel post di ryanday.

0

Ho scoperto che per AS3, solo l'utilizzo delle istruzioni di importazione includerà le classi nell'output, indipendentemente dal fatto che tali classi siano referenziate nel codice effettivo. Confrontalo con Java che includerà solo le classi se sono effettivamente utilizzate, non solo menzionate nelle istruzioni di importazione. Ma ho trovato questo utile quando si progetta un'API Flash, solo menzionare quelle classi nelle istruzioni di importazione e saranno incluse.

Problemi correlati