Пакет импорта Actionscript 3. * vs пакет импорта. Класс - PullRequest
15 голосов
/ 11 августа 2009

В ActionScript 3, есть ли какие-либо издержки между импортом полного пакета и импортом независимых классов?

Например: импорт flash.display. * Против импорта flash.display.Sprite

Я знаю, что это хорошая практика - импортировать только необходимые классы из пакета, чтобы избежать конфликтов, но мне часто говорили, что он также имеет стоимость с точки зрения размера скомпилированного файла, если я импортирую полные пакеты во многих различных классах. которые используют только некоторые классы из этих пакетов.

Интересно, будет ли один класс импортирован раз и навсегда для всего проекта или увеличен ли импорт среди классов, которые их используют.

Результирующий размер скомпилированного файла и производительность во время выполнения - это два разных аспекта этого вопроса.

Ответы [ 8 ]

7 голосов
/ 11 августа 2009

Единственное попадание должно быть во время компиляции, но rday пишет, что в данный момент есть небольшое попадание. Но это должно быть то, что Adobe исправит в будущем.

Операторы импорта на самом деле не должны рассматриваться как фактические операции импорта, это просто способ для компилятора узнать, к каким классам вы обращаетесь.

например. Если вы создали собственный класс Point и он использовался в другом пакете, компилятору необходимо знать, ссылаетесь ли вы на свой собственный класс Point или класс Adobe Point.

В качестве альтернативы можно было бы написать полное имя в любое время, когда вы ссылались на класс.

например. var mySprite:flash.display.Sprite = new flash.display.Sprite();

Как отметил Хуан Пабло Калифано в комментарии, на самом деле это не работает с компилятором (хотя я думаю, что он может работать с AS2). Я просто хотел указать, почему у нас есть оператор import для начала.

В любом случае это не должно влиять на скомпилированный файл, если вы импортируете весь пакет (хотя это в некоторых случаях). Как бы то ни было, это повлияет на время компиляции, поскольку вы даете компилятору больше материала, который ему нужно просмотреть.

Что касается "импорта" одного и того же класса более одного раза. Это не будет иметь значения. Компилятор будет включать один и тот же класс только один раз. В противном случае размер скомпилированного файла быстро выйдет из-под контроля, поскольку большинство классов ссылаются на многие классы, которые снова ссылаются на другие и т. Д. Но опять же, Adobe может оптимизировать это.

Суть в том, что вы должны импортировать только то, что вам нужно, и нет никакого реального преимущества в импорте всего пакета. Просто используйте подходящий инструмент кодирования, такой как FlashDevelop (это бесплатно), и вам даже не придется самостоятельно писать операторы импорта.

В дополнение к этому, если вы компилируете библиотеку (в которую также включен класс, на который не ссылаются), я не уверен, что импорт внешнего пакета может включать его в ваш скомпилированный файл. Это может оказать реальное влияние; хотя, надеюсь, Adobe там не облажался;)

5 голосов
/ 06 июля 2010

Обращаясь к пунктам Райандея, я не могу объяснить дополнительные 3 байта, но несколько примечаний ...

Книга шаблонов проектирования ActionScript также не одобряет это из-за сверхнормативного багажа

Да, на стр. 115, но я думаю, что это неправильно и отправил сообщения об этом.

Спецификация ActionScript 3 гласит, что все публичные имена из пакета будут импортированы, если вы используете '*'. Так что есть хит,

Это вроде как, но я не согласен с интерпретацией и ударил. В нем говорится: «Имена членов пакета сделаны видимыми ...» ( полностью ). В этом контексте речь идет о том, чтобы сделать имена элементов видимыми для инструментов компилятора и редактора, не видимыми в скомпилированном SWF. то есть не означает, что классы компилируются в SWF - если только они не используются (переменная, объявленная этого типа).

Еще один способ посмотреть на это, вы можете вручную импортировать flash.display.MovieClip. Но если вы не создадите экземпляр MovieClip, класс MovieClip не будет скомпилирован в окончательный SWF-файл.

Чтобы удовлетворить себя, я скомпилировал следующий 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.*;

Чистая сборка, и отчет о ссылках выглядит точно так же. Одинаковый размер, такая же оптимизация, те же связанные классы.

В класс SWF попадают только классы Sprite и TextField.

Если посмотреть на фактический размер SWF-файла на диске, то, кажется, есть небольшое (1 или 2 байта) изменение в 3 версиях. Не хуже, чем для более крупного SWF, о котором говорится в сообщении Райандея.

1 голос
/ 21 ноября 2009

Вы можете точно проверить, какие классы импортируются, используя опцию компилятора 'link-report'

Компилятору может потребоваться больше времени, чтобы разобраться, что включать, а что не включать, но если вы ознакомитесь с отчетами о ссылках, вы заметите, что он включает только то, что он использует. :)

1 голос
/ 11 августа 2009

В скомпилированном коде нет абсолютно никакой разницы, импортируете ли вы весь пакет или только те классы, которые используете. Импорт просто важен для компилятора, чтобы найти, где находятся классы.

Вы можете попытаться декомпилировать или просмотреть байт-код до и после.

1 голос
/ 11 августа 2009

Спецификация ActionScript 3 говорит, что все публичные имена из пакета будут импортированы, если вы используете '*'. Таким образом, есть хит, хотя он не может быть большим в зависимости от размера упаковки. Книга Шаблоны ActionScript Designs также не одобряет это из-за избыточного багажа, а также некоторых советов Adobe ActionScript .

При этом я взял один компонент в приложении, которое написал, и

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

Вместо имен отдельных классов. Мой размер увеличился на 3 байта. Теперь все приложение имеет размер 935 КБ, поэтому я, вероятно, импортировал эти классы в другое место, и хит был не очень большим. Бьюсь об заклад, чем меньше будет ваше приложение, тем больше будет влияние на размер вашей компиляции (в процентах).

0 голосов
/ 18 февраля 2011

Я обнаружил, что для AS3, простое использование операторов импорта будет включать классы в ваш вывод, независимо от того, указаны ли эти классы в реальном коде. Сравните это с Java, который будет включать классы только в том случае, если они действительно используются, а не только упомянуты в операторах импорта. Но я нашел это полезным при разработке Flash API, просто упомяните эти классы в операторах импорта, и они будут включены.

0 голосов
/ 11 августа 2009

В общем, хорошая практика - иметь код, который читабелен ... иметь класс, начинающийся с 200 операторов import, поэтому будет довольно плохой практикой ...

в as3 оператор импорта только добавляет новую область видимости к разрешению идентификатора компилятора ... что скомпилировано в SWF, а что нет, определяется не операторами импорта, а фактическими зависимостями, то есть кодом из класса А с использованием класса B ...

так что во время выполнения не имеет значения, как вы импортировали свои классы ...

Greetz

back2dos

0 голосов
/ 11 августа 2009

Как и в большинстве языков, производительность или потеря целых пакетов, а не отдельных классов, незначительны.

Однако это более хорошая практика, поскольку она дает гораздо более краткий обзор зависимостей для вашего класса

...