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

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему  
Старый 07.03.2008, 03:56
WindWalker вне форума Посмотреть профиль Отправить личное сообщение для WindWalker Найти все сообщения от WindWalker
  № 1  
Ответить с цитированием
WindWalker

Регистрация: Nov 2006
Сообщений: 223
По умолчанию Оптимизация: int vs uint, i+=1 vs i++ и т.д.

Провёл небольшое исследование.
1. Что лучше: int или uint, и почему вообще между ними есть разница.
2. Что лучше: i+=1 или i++.

Исследование проводилось следующим образом.
Нижеописанный класс был откомпилирован с помощью командного компилятора из Flex SDK (надо отметить, что компилятор Flash CS3 выдаёт те же результаты).
Затем полученный .swf был декомпилирован с помощью abcdump из проекта Tamarin.

Код:
package {
	public class Test {
		private var a:int;
		private var b:uint;

		private  function int_field():void {
			a=0;
			a++;
			a+=1;
		}

		private  function uint_field():void {
			b=0;
			b++;
			b+=1;
		}

		private  function int_local():void {
			var c:int;
			c=0;
			c++;
			c+=1;
		}

		private  function uint_local():void {
			var d:uint;
			d=0;
			d++;
			d+=1;
		}
	}

}
Итого, у нас есть 3 операции, и 4 случая их использования: для локальной переменной и для поля, для uint и для int.

Вот так выглядит присвоение x = 0:
Поле int:
Код:
findproperty  	private::a
pushbyte      	0
initproperty  	private::a
Поле uint:
Код:
findproperty  	private::b
pushbyte      	0
initproperty  	private::b
Локальная int:
Код:
pushbyte      	0
setlocal1
Локальная uint:
Код:
pushbyte      	0
convert_u     	
setlocal1
Вот так выглядит i++:

Поле int:
Код:
findpropstrict	private::a
dup           	
setlocal1     	
getproperty   	private::a
increment_i   	
setlocal2     	
getlocal1     	
getlocal2     	
setproperty   	private::a
kill          	2
kill          	1
Поле uint:
Код:
findpropstrict	private::b
dup           	
setlocal1     	
getproperty   	private::b
increment     	
setlocal2     	
getlocal1     	
getlocal2     	
setproperty   	private::b
kill          	2
kill          	1
Локальная int:
Код:
inclocal_i    	1
Локальная uint:
Код:
getlocal1     	
increment     	
convert_u     	
setlocal1
Вот так выглядит i+=1:

Поле int:
Код:
findproperty  	private::a
getlex        	private::a
pushbyte      	1
add           	
initproperty  	private::a
Поле uint:
Код:
findproperty  	private::b
getlex        	private::b
pushbyte      	1
add           	
initproperty  	private::b
Локальная int:
Код:
getlocal1     	
pushbyte      	1
add           	
convert_i     	
setlocal1
Локальная uint:
Код:
getlocal1     	
pushbyte      	1
add           	
convert_u     	
setlocal1

Выводы:

1. Для полей нет разницы между int и uint (кроме области допустимых значений, разумеется).
2. При работе с локальными переменными типа uint часто используется инструкция конвертации convert_u, которая хоть и не значительно, но тем не менее может снизить произодительность. convert_i тоже иногда используется, но реже.
3. При работе с полями объекта выражение i+=1 компилируется в гораздо меньшее количество инструкций, чем i++ и выполняется значительно быстрее.
4. Наиболее быстрым выражением является i++ если i - это локальная переменная типа int. В этом случае выражение компилируется всего в одну инструкцию AVM2. Если i типа uint, то получается уже 4 инструкции.


Последний раз редактировалось WindWalker; 07.03.2008 в 04:21.
Создать новую тему   Часовой пояс GMT +4, время: 14:53.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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