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

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

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

Регистрация: 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.
Старый 07.03.2008, 09:04
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 2  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
Занятненько...
Спасибо.
__________________
тонкий тролль, осеянный благодатью

Старый 07.03.2008, 12:46
terbooter вне форума Посмотреть профиль Отправить личное сообщение для terbooter Найти все сообщения от terbooter
  № 3  
Ответить с цитированием
terbooter

Регистрация: Oct 2006
Адрес: Novosibirsk-Kaliningrad
Сообщений: 1,278
Отправить сообщение для terbooter с помощью ICQ Отправить сообщение для terbooter с помощью Skype™
Спасибо.
А я давно подозревал и везде использовал int вместо uint.
uint только в константах.

Старый 07.03.2008, 13:13
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 4  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,784
Не забывайте, что это разница в скорости актуальна при использовании полей класса, а не локальных переменных.

Старый 07.03.2008, 13:13
Iv вне форума Посмотреть профиль Отправить личное сообщение для Iv Посетить домашнюю страницу Iv Найти все сообщения от Iv
  № 5  
Ответить с цитированием
Iv
 
Аватар для Iv

Регистрация: Apr 2001
Адрес: Moscow
Сообщений: 1,475
выигрыш/проигрыш производительности составляет настолько мизерную разницу, что я не могу привести реальный пример, где бы это сыграло хоть малейшую роль.

Старый 07.03.2008, 13:14
Torero вне форума Посмотреть профиль Отправить личное сообщение для Torero Найти все сообщения от Torero
  № 6  
Ответить с цитированием
Torero
[+1.4 18.06.07]
 
Аватар для Torero

Регистрация: May 2007
Адрес: Moscow
Сообщений: 263
Спасибо. Интересно. На буржуйском сайте тайминг проводили - самый быстрый цикл выглядел следующим образом:
Код:
var i:int;
while(i++<100000){
	...
}
__________________
А я Томат.

Старый 07.03.2008, 14:10
WindWalker вне форума Посмотреть профиль Отправить личное сообщение для WindWalker Найти все сообщения от WindWalker
  № 7  
Ответить с цитированием
WindWalker
[+1 18.03.08]

Регистрация: Nov 2006
Сообщений: 223
Конечно, всё ещё во многом зависит от того, как байт-код будет переведён в нативнй код jit-компилятором.
Однако, здравый смысл подсказывает, что
Код:
inclocal_i    	1
должно работать быстрее, чем
Код:
getlocal1     	
increment     	
convert_u     	
setlocal1
Хотя не исключён вариант, что inclocal_i компилируется в итоге абсолютно в то же самое, что и 4 инструкции.
А колупать исходники AVM2 как-то не очень хочется

Старый 07.03.2008, 18:31
2morrowMan вне форума Посмотреть профиль Отправить личное сообщение для 2morrowMan Найти все сообщения от 2morrowMan
  № 8  
Ответить с цитированием
2morrowMan
 
Аватар для 2morrowMan

Регистрация: Aug 2007
Сообщений: 467
Использовался Flex Builder 3 ?

Старый 07.03.2008, 19:28
Iv вне форума Посмотреть профиль Отправить личное сообщение для Iv Посетить домашнюю страницу Iv Найти все сообщения от Iv
  № 9  
Ответить с цитированием
Iv
 
Аватар для Iv

Регистрация: Apr 2001
Адрес: Moscow
Сообщений: 1,475
Из классики:

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

К чему это я свои 5 копеек в этот флейм тащу:
Производительность конкретного кода цикла здесь обсуждается не в рамках единого процесса оптимизации, а как отдельная фишка.

Боюсь, что знание методологии оптимизации кода в данном топике подменяется на следование ничему не значащим фактам.
Почему не значащим? Потому, что один лишний вызов метода съест с лихвой всю экономию на всех циклах за всё время работы приложения.

Не питайте иллюзий, что сабж вам поможет писать быстрые приложения.

ИМХО


Последний раз редактировалось Iv; 07.03.2008 в 20:05.
Старый 07.03.2008, 23:48
WindWalker вне форума Посмотреть профиль Отправить личное сообщение для WindWalker Найти все сообщения от WindWalker
  № 10  
Ответить с цитированием
WindWalker
[+1 18.03.08]

Регистрация: Nov 2006
Сообщений: 223
Цитата:
Сообщение от 2morrowMan
Использовался Flex Builder 3 ?
Нет, Flex Builder вообще никакой не использовался
Использовался консольный компилятор из Flex 2 SDK.
Кстати, хорошая идея! Надо проверить, в Flex 3 SDK, может быть что-то изменилось.


Цитата:
Сообщение от Iv
Из классики:
Только после окончания создания приложения следует протестировать производительность приложения, и только затем, на основании конкретных результатов тестов производить пошаговую оптимизацию, каждый раз обращая внимание на самые проблемные места кода.
.....
Почему не значащим? Потому, что один лишний вызов метода съест с лихвой всю экономию на всех циклах за всё время работы приложения.
А с этим никто и не спорит.

Тем не менее, для того, чтобы оптимизировать, необходимо знать как влияют на быстродействие те или иные операции.
Например, то, что вызов методов в AS3 происходит крайне медленно - это ведь тоже не с потолка взято, а опять же было проверено экспериментально.

И, скажем, тот факт, что в AS1/AS2 использование x & 1 вместо x % 2 не давало никакого выигрыша, тоже кто-то когда-то проверил.

Это я к тому, что методология методологией, но без знания быстродействия конкретных элементарных операций будет вообще непонятно КАК оптимизировать (за исключением оптимизации алгоритма, разумеется).

Создать новую тему Ответ Часовой пояс GMT +4, время: 19:32.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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