代码之家  ›  专栏  ›  技术社区  ›  user105813

actionScript 3导入包。*vs导入包.class

  •  15
  • user105813  · 技术社区  · 15 年前

    在ActionScript3中,导入完整的包和导入独立的类之间是否存在卷轴开销?

    例如:导入flash.display.*与导入flash.display.sprite

    我知道只从包中导入所需的类以避免冲突是一个很好的实践,但是我经常被告知,如果我从许多不同的类中导入完整的包,而这些类只使用那些包中的某些类,那么从编译文件的大小来看,这也会带来成本。

    我想知道是否会为整个项目一次性导入一个类,或者导入是否会在使用它们的类之间成倍增加。

    产生的编译文件大小和运行时性能是这个问题涉及的两个不同方面。

    8 回复  |  直到 13 年前
        1
  •  7
  •   Jacob Poul Richardt    15 年前

    唯一的打击应该是编译时,但是 星期天 写下有一个表面上的小打击。但这应该是Adobe将来要解决的问题。

    import语句不应该被视为实际的导入,它只是编译器了解您所引用的类的一种方法。

    如果你拥有 Point 类,并且它正在另一个包中使用,编译器需要知道您是否引用自己的包。 类或Adobe 班级。

    另一种方法是每次引用类时都编写完全限定名。

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

    正如所指出的 加州胡安·帕布罗 在注释中,这实际上不适用于编译器(尽管我认为它可能适用于AS2)。我只是想指出为什么我们要从进口声明开始。

    在任何情况下,如果导入一个完整的包,它都不应该影响编译后的文件(尽管它表面上是这样)。它将如何影响编译时间,因为你给了编译器更多的东西,它需要查看。

    至于“导入”同一个类多次。这不会有什么不同。编译器将只包含同一个类一次。否则,编译后的文件大小将很快失去控制,因为大多数类引用了许多类,而这些类又引用了其他类等,但同样,Adobe可能需要对此进行优化。

    归根结底,你应该只进口你需要的东西,没有真正的优势,进口一个完整的包。只需使用适当的编码工具,如 FlashDevelop (这是免费的)而且您甚至不必自己编写导入语句。

    另一方面,如果您正在编译一个库(其中还包括一个未引用的类),我不确定导入的外部包是否可能包含在您编译的文件中。这可能会产生实际的影响;不过希望Adobe不会搞砸;)

        2
  •  5
  •   creacog    13 年前

    在谈到Ryanday的观点时,我无法解释额外的3个字节,但需要注意几点…

    ActionScript设计模式手册也不鼓励这样做,因为行李太多

    是的,在115页,但我认为这是错误的,并提交了相关的勘误表。

    actionscript 3规范说,如果使用“*”,包中的所有公共名称都将被导入。所以有一个打击,

    是的,但我不同意重新解释和点击。上面写着:“包裹成员的名字是 看得见的 ……” in full )在本文中,它指的是为成员命名 看得见的 对于编译器和编辑器工具,在已编译的SWF中不可见。也就是说 表示类被编译到SWF中,除非它们被实际使用(声明为该类型的变量)。

    另一种方法是,您可以手动导入 flash.display.MovieClip . 但是,如果不创建movieclip的任何实例,movieclip类将不会编译为最终的SWF。

    为了让自己满意,我用3种方式编译了下面的helloworld,输出@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;
    

    清除生成,链接报告看起来完全相同。大小相同,优化大小相同,链接类相同。

    第三,删除链接报告文件并将导入更改为:

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

    清除生成,链接报告看起来完全相同。大小相同,优化大小相同,链接类相同。

    在每种情况下,只有sprite和textfield类才能到达SWF。

    从磁盘上的实际SWF文件大小来看,与3个版本相比,似乎存在细微的(1或2字节)变化。不比Ryanday的帖子中提到的更大的SWF更糟糕。

        3
  •  1
  •   ryanday    15 年前

    这个 ActionScript 3 spec 表示如果使用“*”,将导入包中的所有公共名称。所以有一个打击,虽然它可能不是一个大的,取决于包的大小。这个 ActionScript Design Patterns 由于行李过多,书籍也不鼓励这样做,还有一些 Adobe ActionScript tips .

    也就是说,我在自己编写的应用程序中使用了一个组件,

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

    而不是单个类名。我的大小增加了3个字节。现在,整个应用程序的容量是935Kb,所以我可能把这些类导入了其他地方,但点击率并不是很大。我敢打赌,应用程序越小,对编译大小的影响就越大(按百分比计算)。

        4
  •  1
  •   Ammar    15 年前

    无论是导入整个包还是只导入正在使用的类,编译后的代码都完全没有区别。导入对于编译器查找类的位置非常重要。

    您可以尝试在前后对字节码进行反编译或查看。

        5
  •  1
  •   timoxley    15 年前

    您可以使用 'link-report' compiler option

    编译器可能需要更长的时间来整理要包含的内容和不包含的内容,但是如果您查看链接报告,您会发现它只包含它使用的内容。:)

        6
  •  0
  •   Jambobond    15 年前

    与大多数语言一样,导入整个包(而不是单个类)几乎没有或根本没有性能开销。

    然而,这是一个更好的实践,因为它为类提供了更简洁的依赖性。

        7
  •  0
  •   back2dos    15 年前

    好的实践通常是让代码可读…以200个import语句开头的类将是非常糟糕的做法…

    在AS3中,import语句只将新的作用域添加到编译器的标识符解析中…编译成SWF的内容和不编译成SWF的内容不是由导入语句决定的,而是由实际依赖性决定的,即使用B类的A类代码…

    所以在运行时,它没有任何区别,你如何导入你的类…

    尔兹

    后台操作系统

        8
  •  0
  •   loungerdork    13 年前

    我发现,与AS3相比,仅仅使用import语句将在输出中包含类,而不管这些类是否在实际代码中被引用。将此与Java进行对比,Java只包含实际使用的类,而不仅仅是导入语句中提到的。但在设计FlashAPI时,我发现这一点很有用,只要在import语句中提到这些类,它们就会包含在内。