15

Actionscript 3 では、完全なパッケージのインポートと独立したクラスのインポートの間にリールのオーバーヘッドはありますか?

例: import flash.display.* と import flash.display.Sprite の比較

競合を避けるためにパッケージから必要なクラスのみをインポートするのが良い方法であることは知っていますが、完全なパッケージを多くの異なるクラスでのみインポートすると、コンパイルされたファイルサイズの点でコストがかかるとよく言われます。それらのパッケージのいくつかのクラス。

プロジェクト全体で 1 つのクラスを 1 回インポートするのか、それともそれを使用するクラス間でインポートを乗算するのかは疑問です。

結果として得られるコンパイル済みファイルのサイズとランタイム パフォーマンスは、この質問に含まれる 2 つの異なる側面です。

4

8 に答える 8

7

唯一のヒットはコンパイル時であるべきですが、rdayは明らかに小さなヒットがあると書いています。しかし、それはアドビが将来修正するものであるべきです.

import ステートメントは、実際の import と見なすべきではありません。これは、参照しているクラスをコンパイラが知る方法にすぎません。

例えば。独自のクラスを作成し、それが別のパッケージで使用されている場合、コンパイラは、独自のクラスを参照しているか、AdobeクラスPointを参照しているかを知る必要があります。PointPoint

別の方法は、クラスを参照するたびに完全修飾名を記述することです。

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

コメントでJuan Pablo Califanoが指摘したように、これは実際にはコンパイラでは機能しません (ただし、AS2 では機能する可能性があると思います)。なぜ私たちが import ステートメントを持っているのかを指摘したかっただけです。

いずれにせよ、パッケージ全体をインポートしても、コンパイルされたファイルには影響しません (明らかに影響します)。コンパイラーが調べる必要のあるものをさらに与えるので、コンパイル時間にどのように影響しますか。

同じクラスを複数回「インポート」する場合。違いはありません。コンパイラは、同じクラスを 1 回だけインクルードします。そうしないと、ほとんどのクラスが他のクラスを参照する多くのクラスを参照するため、コンパイルされたファイルのサイズがすぐに制御不能になります。

要するに、必要なものだけをインポートする必要があるということです。パッケージ全体をインポートする利点はありません。FlashDevelop (無料) などの適切なコーディング ツールを使用するだけで、インポート ステートメントを自分で記述する必要さえありません。

ちなみに、ライブラリをコンパイルしている場合(参照されていないクラスも含まれている場合)、外部パッケージをインポートすると、コンパイルされたファイルにそれが含まれるかどうかわかりません。それは実際に影響を与える可能性があります。願わくば、アドビがそこを台無しにしないことを願っています ;)

于 2009-08-11T14:17:53.380 に答える
5

ryandayさんの指摘で、余分な3バイトは説明できませんが、いくつか注意点を...

ActionScript Design Patterns book も、荷物が多すぎるため、これを推奨していません。

ええ、115ページですが、それは間違っていると思い、その趣旨で正誤表を提出しました。

ActionScript 3 仕様では、「*」を使用すると、パッケージのすべての公開名がインポートされると規定されています。ヒットがあるので、

それは一種のことですが、解釈とヒットについては同意しません。「パッケージメンバーの名前が表示されます...」(完全に)。このコンテキストでは、コンパイルされた 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;

クリーン ビルドで、リンク レポートはまったく同じに見えます。同じサイズ、同じ最適化サイズ、同じリンク クラス。

3 番目に、リンク レポート ファイルを削除し、インポートを次のように変更します。

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

クリーン ビルドで、リンク レポートはまったく同じに見えます。同じサイズ、同じ最適化サイズ、同じリンク クラス。

いずれの場合も、Sprite クラスと TextField クラスのみが SWF に到達します。

ディスク上の実際の SWF ファイル サイズを見ると、3 つのバージョンでわずかな (1 または 2 バイト) の違いがあるように見えます。ryanday の投稿で言及されているより大きな SWF よりも悪くはありません。

于 2010-07-06T12:47:31.497 に答える
1

'link-report'コンパイラオプションを使用して、インポートされているクラスを正確に確認できます。

コンパイラは、含めるものと含めないものを分類するのに時間がかかる場合がありますが、リンクレポートを確認すると、使用するものだけが含まれていることがわかります。:)

于 2009-11-21T17:37:59.840 に答える
1

パッケージ全体をインポートするか、使用しているクラスのみをインポートするかにかかわらず、コンパイルされたコードにまったく違いはありません。インポートは、コンパイラがクラスの場所を見つけるために重要です。

前後のバイトコードを逆コンパイルまたは調べることができます。

于 2009-08-11T18:40:29.127 に答える
1

ActionScript 3 仕様では、「*」を使用すると、パッケージのすべての公開名がインポートされると規定されています。なので、パッケージの大きさによっては大したものではないかもしれませんが、ヒットはあります。ActionScript Design Patterns book も、余分な荷物といくつかのAdob​​e ActionScript のヒントのために、これを思いとどまらせています。

そうは言っても、私が書いたアプリのコンポーネントとして1つを取り、

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

単一のクラス名の代わりに。私のサイズは3バイト増加しました。現在、アプリ全体が 935kB であるため、これらのクラスを別の場所にインポートした可能性があり、ヒットはそれほど大きくありませんでした。アプリケーションが小さければ小さいほど、コンパイル サイズへの影響は大きくなります (パーセント単位)。

于 2009-08-11T11:45:09.553 に答える
0

ほとんどの言語と同様に、個々のクラスではなくパッケージ全体をインポートすることに関連するパフォーマンスのオーバーヘッドはほとんどまたはまったくありません。

ただし、クラスの依存関係のより簡潔なビューを提供するため、より良い方法です。

于 2009-08-11T11:36:27.853 に答える
0

AS3 よりも、インポート ステートメントを使用するだけで、クラスが実際のコードで参照されているかどうかに関係なく、出力にクラスが含まれることを発見しました。これを、インポートステートメントで言及されているだけでなく、実際に使用されている場合にのみクラスを含む Java と比較してください。しかし、これは Flash API を設計するときに役立つことがわかりました。インポート ステートメントでこれらのクラスを指定するだけで、それらのクラスが含まれます。

于 2011-02-18T06:49:48.763 に答える