2009-08-11 76 views
15

在Actionscript 3中,導入完整包與導入獨立類之間是否存在任何卷軸開銷?Actionscript 3 import package。* vs import package.Class

如:進口flash.display一*與進口flash.display.Sprite

我知道這是從包裝,以避免衝突只導入所需的類一個很好的做法,但我經常被告知如果我在許多不同的類中導入完整的軟件包,只使用這些軟件包中的某些類,那麼它在編譯的文件大小方面也會產生成本。

我想知道一個類是否會爲整個項目導入一次,或者如果導入在使用它們的類中相乘。

生成的編譯文件大小和運行時性能是這個問題所包含的兩個不同方面。

回答

7

唯一的命中應該是編譯時間,但rday寫道,有一個小小的命中。但是,這應該是Adobe未來將要解決的問題。

導入語句不應該被視爲實際導入,它只是編譯器知道你正在引用哪個類的一種方式。

例如。如果您自己創建了Point類,並且它正在被另一個包使用,編譯器需要知道您是否在引用您自己的類或者類Point類。

另一種方法是編寫您引用到課程的完全限定名稱加班。

例如。 var mySprite:flash.display.Sprite = new flash.display.Sprite();

正如胡安·巴勃羅·卡利法諾在評論中指出,這實際上並沒有與編譯器的工作(雖然我認爲它可能與AS2工作)。我只是想指出爲什麼我們有開始的進口聲明。

在任何情況下,如果您導入整個軟件包(儘管它顯然是這樣),它不應該影響編譯的文件。它會影響編譯時間,因爲您正在給編譯器提供更多需要查看的內容。

至於「導入」相同的類不止一次。它不會有所作爲。編譯器將只包含一次相同的類。否則,編譯後的文件大小會很快失去控制,因爲大多數類引用了許多類,這些類又引用了其他類。但是,Adobe也許會在那裏進行優化。

底線是你應該只導入你需要的東西,導入整個包沒有真正的優勢。只需使用一個合適的編碼工具,如FlashDevelop(它是免費的),您甚至不必親自編寫導入語句。如果你正在編譯一個庫(其中還包括一個不涉及的類),我不確定導入一個外部包是否可能包含你編譯的文件。這可能會產生實際影響;雖然希望的Adobe沒有搞砸那裏;)

+1

只需注意:即使您在代碼中使用完全限定的路徑,也需要導入,否則編譯器會發出抱怨。 – 2009-08-12 00:48:20

+0

的確,我忘記了。但它更多意味着爲什麼我們有進口聲明,因爲替代方案會非常煩人。 – 2009-08-12 10:43:46

+0

沒問題。是的,這是AS 2中的行爲。如果使用完全限定名稱,則可以省略導入。 – 2009-08-13 01:24:58

0

與大多數語言一樣,導入整個軟件包而不是單個類的性能開銷很少或根本沒有。

但它更是一個很好的做法,因爲它給人的依賴更加簡潔教職員爲你的類

1

ActionScript 3 spec說,如果你使用從包中所有的公共名稱將進口的「*」。所以有一個打擊,雖然它可能不是一個大的取決於包的大小。 ActionScript Design Patterns書也由於超重行李,以及一些Adobe ActionScript tips而不鼓勵。

話雖這麼說,我在一個應用程序,我寫和

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

取而代之的是單一類名的一個了作爲組分。我的大小增加了3個字節。現在,整個應用程序是935kB,所以我可能會將這些類導入其他地方,並且這個熱門程度並不是很大。我敢打賭,你的應用程序越小,對編譯大小的影響就越大(百分比明智)。

+0

有點不好意思,編譯器無法優化。 – 2009-08-11 13:59:46

+0

但我認爲更多的優化意味着更多的時間來編譯(發佈),Flash AS3在發佈過程中緩慢。所以在我看來,首先他們應該把它變得更好(類似於更高的語言,只編譯增量)並且更快,然後他們應該考慮這些優化。 ! :) – DexTer 2009-08-11 14:30:09

0

好的做法是,一般有代碼,可讀......有一類開始與200個import語句從而將是相當不好的做法...

在as3中,導入語句僅向編譯器的標識符解析添加了一個新的範圍...編譯成SWF文件的內容不是由導入語句確定的,而是由實際依賴性確定的,即來自A類的代碼使用類B ...

所以在運行時它沒有任何區別,你是如何導入你的類的...

個格爾茨

back2dos

+0

+1。我個人喜歡明確導入每個班級。不過,如果我必須手動完成,我會考慮兩次。但是,無論如何,你是對的如何進口的作品。這是一個編譯器指令,但不強制編譯。否則,爲什麼會有人使用「var dummy:SomeClass;」黑客迫使包含在代碼中沒有引用的類? – 2009-08-12 00:52:39

1

是絕對的編譯代碼是否導入整個包或只是你正在使用的類沒有區別。導入對編譯器來說很重要,可以找到類的位置。

你可以嘗試反編譯或查看前後的字節碼。

1

您可以檢查類正在使用'link-report' compiler option

編譯器可能需要更長的時間來梳理一下,包括什麼不包括進口什麼,但如果你看看你的鏈接報告,您會注意它只包含它使用的內容。 :)

5

尋址ryanday的點,我無法解釋額外的3個字節,但也有少數筆記...

ActionScript的設計模式一書也鼓勵這種因行李超重

是的,第115頁,但我認爲這是錯誤的,並提交了勘誤表。

如果您使用'*',則ActionScript 3規範將聲明包中的所有公共名稱。所以有一個命中,

這種有,但我不同意重新解釋和命中。它說:「包裝成員的名稱是可見 ...」(in full)。在這種情況下,它指的是編譯器和編輯器工具使成員可見的名稱在編譯的SWF中不可見。即而不是是指將類編譯到SWF中 - 除非實際使用它們(聲明該類型的變量)。

查看此問題的另一種方法是,您可以手動導入flash.display.MovieClip。但是,如果您未創建任何MovieClip實例,則MovieClip類將不會被編譯到最終的SWF中。

爲了滿足我自己,我整理了以下的HelloWorld有3種方式,輸出鏈路報告@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); 
     } 
    } 
} 

首先,書面,鏈接報告:

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

乾淨的構建,並鏈接不到原始t看起來完全一樣。相同的大小,相同的優化,相同的鏈接類。

三,刪除鏈接的報告文件並更改進口:

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

乾淨的構建,並鏈接報告長得一模一樣。相同的大小,相同的優化,相同的鏈接類。

只有Sprite和TextField類在每種情況下都使它成爲SWF。

看看磁盤上的實際SWF文件大小,在3個版本中似乎有一個輕微(1或2字節)的變化。沒有比在ryanday的崗位中提到的更大的SWF更糟。

0

我發現比AS3,只是使用import語句將包括輸出中的類,無論這些類是否在實際代碼中引用。將它與Java進行對比,只有在實際使用時纔會包含類,而不只是在導入語句中提到。但是我發現在設計Flash API時這很有用,只需在import語句中提及這些類,它們就會包含在內。