Release vs Debug версии с точки зрения скорости
[UPDATE]
Всё нижеперечисленное имеет место только для просмотра в дебаг версии плеера;
В релиз версии плеера оно не имеет разницы, поэтому статья носит строго ознакомительный характер.
Возможно, вы замечали что версии Release работают быстрее, чем версии Debug, скомпилированные mxmlc? Лично я до недавнего времени этого даже не замечал.
Итак, давайте посмотрим:
У нас есть код
package { import flash.display.Sprite; import flash.events.MouseEvent; import flash.text.TextField; import flash.utils.getTimer; public class TestMain extends Sprite { private var _textField:TextField; public function TestMain() { super(); super.graphics.beginFill(0, 1); super.graphics.drawRect(0, 0, 100, 100); super.graphics.endFill(); super.stage.addEventListener(MouseEvent.CLICK, onClick); _textField = new TextField(); _textField.x = 200; _textField.multiline = true; super.addChild(_textField); } private function onClick(e:MouseEvent):void { var i:int; var timer:Number; var a:int; timer = getTimer(); i = 10000000; while (i--) { a = 2 / 2; } _textField.appendText("a/2 time: " + (getTimer() - timer) + "\n"); timer = getTimer(); i = 10000000; while (i--) { a = 2 >> 1; } _textField.appendText("2>>1 time: " + (getTimer() - timer) + "\n"); } } }
Давайте скомпилируем версию Release и версию Debug и посмотрим результаты.
В Release версии у меня результаты 80 и 42 соответственно, в Debug 852, 732. Вау, неправда ли? Разница на порядок!
Давайте разберемся, что же происходит:
Первое, что приходит в голову - это какая-то разница в байткоде, помимо просто служебной информации в Release версии. Основная нагрузка заключается в вычислениях деления и сдвига 10 миллионов раз, давайте поглядим на них.
Итак, у флешки скомпиленной в Debug:
Нормальный цикл, полный прогон всего while, внутри while честная делёжка:
Код:
pushbyte 2 pushbyte 1 divide convert_i setlocal 4
Код:
pushbyte 2 pushbyte 1 rshift convert_i setlocal 4
сдвиг. Никакой оптимизации, код почти аналогичный.
Однако, различия всё же есть:
Debug:
Код:
getlocal2 dup decrement_i convert_i setlocal2
Код:
getlocal2 dup decrement_i setlocal2
Зацикливание в Release:
Код:
iftrue LOC_2:
Код:
convert_b iftrue LOC_2:
В целом, везде при записи переменных в Debug конвертирует значения.
Методы тоже вызываются по разному:
У Release:
Код:
callpropvoid appendText,1
Код:
callproperty appendText,1 pop
Неужели из за лишней конвертации значений разница в скорости на порядок? Ну, всё может быть. Доверяй, но проверяй: удалив опкоды этой конвертации я запустил флешку снова... и не заметил разницы. Действительно, опкоды конвертации были удалены, но разницы в скорости не последовало.
Для тех, кто не знает - опкод это специальная команда, которую понимает виртуальная машина AVM2, которая работает в FlashPlayer.
В чем же разница? Просматривая код, подчищенный от "лишних" конвертаций я заметил лишь одну разницу: в Debug версии сохранялись дебаговские опкоды (по сути, то ради чего и была сделана Debug компиляция) - debugline и debugfile, в релизе их нету (и быть не должно). Да-да, тех самых опкодов, благодаря которой при RTE вы видите подробное описание ошибки.
Дебаг плеер натыкаясь на этот опкод записывает его в какое-то своё внутреннее представление, чтобы на любом опкоде всё ещё помнить, к какой строчке кода относится речь, какой полный путь файла и так далее. Эта запись и отнимает львиную долю времени; В Релиз плеере плеер эти опкоды пропускает, отчего и наблюдается "скачок" в скорости.
Всего комментариев 4
Комментарии
14.08.2010 13:58 | |
Почему CS4 всегда делает релиз? Я думал всегда, что наоборот - я ведь там ловлю трейсы, натыкаюсь на эксепшены...
|
14.08.2010 18:03 | |
Волгоградец, забудь: я по неопытности не знал о некоторых настройках в Flash IDE.
|
15.12.2010 00:58 | |
Иногда забываю конечный проект переводить в релиз. А оно, помимо веса, еще и прирост к скорости дает...
|
15.12.2010 01:02 | |
Цитата:
А оно, помимо веса, еще и прирост к скорости дает...
|
Последние записи от Psycho Tiger
- Тонкости и трюки ActionScript`а, которые... бесполезны (10.05.2011)
- Vkontakte: как пользоваться wall.post, нужен ли теперь wall.savePost? (05.03.2011)
- А пятый контер-страйк хорош. (19.01.2011)
- Пацаны, гоу Вконтакте? (21.12.2010)
- Давайте начистоту (18.12.2010)