Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > Psycho Tiger

Оценить эту запись

Release vs Debug версии с точки зрения скорости

Запись от Psycho Tiger размещена 13.08.2010 в 17:49
Обновил(-а) Psycho Tiger 15.08.2010 в 00:43

[UPDATE]
Всё нижеперечисленное имеет место только для просмотра в дебаг версии плеера;
В релиз версии плеера оно не имеет разницы, поэтому статья носит строго ознакомительный характер.

Возможно, вы замечали что версии Release работают быстрее, чем версии Debug, скомпилированные mxmlc? Лично я до недавнего времени этого даже не замечал.

Итак, давайте посмотрим:
У нас есть код
Код AS3:
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
А что у Release? А у Release всё аналогично. Честный цикл, честная дележка, честный
сдвиг. Никакой оптимизации, код почти аналогичный.

Однако, различия всё же есть:
Debug:
Код:
getlocal2        
dup 
decrement_i 
convert_i 
setlocal2
Release:
Код:
getlocal2 
dup 
decrement_i 
setlocal2
В Debug делают лишний конверт переменной в integer.
Зацикливание в Release:
Код:
iftrue LOC_2:
В Debug:
Код:
convert_b 
iftrue LOC_2:
Ещё один конверт к Boolean.

В целом, везде при записи переменных в Debug конвертирует значения.
Методы тоже вызываются по разному:
У Release:
Код:
callpropvoid appendText,1
У Debug:
Код:
callproperty appendText,1
pop
Но это мелочи.

Неужели из за лишней конвертации значений разница в скорости на порядок? Ну, всё может быть. Доверяй, но проверяй: удалив опкоды этой конвертации я запустил флешку снова... и не заметил разницы. Действительно, опкоды конвертации были удалены, но разницы в скорости не последовало.
Для тех, кто не знает - опкод это специальная команда, которую понимает виртуальная машина AVM2, которая работает в FlashPlayer.

В чем же разница? Просматривая код, подчищенный от "лишних" конвертаций я заметил лишь одну разницу: в Debug версии сохранялись дебаговские опкоды (по сути, то ради чего и была сделана Debug компиляция) - debugline и debugfile, в релизе их нету (и быть не должно). Да-да, тех самых опкодов, благодаря которой при RTE вы видите подробное описание ошибки.
Дебаг плеер натыкаясь на этот опкод записывает его в какое-то своё внутреннее представление, чтобы на любом опкоде всё ещё помнить, к какой строчке кода относится речь, какой полный путь файла и так далее. Эта запись и отнимает львиную долю времени; В Релиз плеере плеер эти опкоды пропускает, отчего и наблюдается "скачок" в скорости.
Всего комментариев 4

Комментарии

Старый 14.08.2010 13:58 Волгоградец вне форума
Волгоградец
 
Аватар для Волгоградец
Почему CS4 всегда делает релиз? Я думал всегда, что наоборот - я ведь там ловлю трейсы, натыкаюсь на эксепшены...
Старый 14.08.2010 18:03 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Волгоградец, забудь: я по неопытности не знал о некоторых настройках в Flash IDE.
Старый 15.12.2010 00:58 КорДум вне форума
КорДум
 
Аватар для КорДум
Иногда забываю конечный проект переводить в релиз. А оно, помимо веса, еще и прирост к скорости дает...
Старый 15.12.2010 01:02 iNils вне форума
iNils
 
Аватар для iNils
Цитата:
А оно, помимо веса, еще и прирост к скорости дает...
О, да. Разница между запуском основного класса составляет порядка 0.5 секунды.
 

 


Часовой пояс GMT +4, время: 01:17.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.