![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
[+1 18.03.08]
Регистрация: Nov 2006
Сообщений: 223
|
Провёл небольшое исследование.
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;
}
}
}
Вот так выглядит присвоение x = 0: Поле int: Поле uint: Локальная int: Локальная uint: Вот так выглядит i++: Поле int: findpropstrict private::a dup setlocal1 getproperty private::a increment_i setlocal2 getlocal1 getlocal2 setproperty private::a kill 2 kill 1 findpropstrict private::b dup setlocal1 getproperty private::b increment setlocal2 getlocal1 getlocal2 setproperty private::b kill 2 kill 1 Локальная uint: Вот так выглядит i+=1: Поле int: Поле uint: Локальная int: Локальная uint: Выводы: 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. |
|
|||||
|
Спасибо.
А я давно подозревал и везде использовал int вместо uint. uint только в константах.
__________________
Сам себе репортер |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Не забывайте, что это разница в скорости актуальна при использовании полей класса, а не локальных переменных.
|
|
|||||
|
Регистрация: Apr 2001
Адрес: Moscow
Сообщений: 1,475
|
выигрыш/проигрыш производительности составляет настолько мизерную разницу, что я не могу привести реальный пример, где бы это сыграло хоть малейшую роль.
|
|
|||||
|
[+1.4 18.06.07]
Регистрация: May 2007
Адрес: Moscow
Сообщений: 263
|
Спасибо. Интересно. На буржуйском сайте тайминг проводили - самый быстрый цикл выглядел следующим образом:
__________________
А я Томат. |
|
|||||
|
[+1 18.03.08]
Регистрация: Nov 2006
Сообщений: 223
|
Конечно, всё ещё во многом зависит от того, как байт-код будет переведён в нативнй код jit-компилятором.
Однако, здравый смысл подсказывает, что должно работать быстрее, чем Хотя не исключён вариант, что inclocal_i компилируется в итоге абсолютно в то же самое, что и 4 инструкции. А колупать исходники AVM2 как-то не очень хочется ![]() |
|
|||||
|
Регистрация: Aug 2007
Сообщений: 467
|
Использовался Flex Builder 3 ?
|
|
|||||
|
Регистрация: Apr 2001
Адрес: Moscow
Сообщений: 1,475
|
Из классики:
На первом этапе программирования нужно сосредоточиться на правильной архитектуре приложения, читабельности кода, прозрачности и правильности логики. Только после окончания создания приложения следует протестировать производительность приложения, и только затем, на основании конкретных результатов тестов производить пошаговую оптимизацию, каждый раз обращая внимание на самые проблемные места кода. К чему это я свои 5 копеек в этот флейм тащу: Производительность конкретного кода цикла здесь обсуждается не в рамках единого процесса оптимизации, а как отдельная фишка. Боюсь, что знание методологии оптимизации кода в данном топике подменяется на следование ничему не значащим фактам. Почему не значащим? Потому, что один лишний вызов метода съест с лихвой всю экономию на всех циклах за всё время работы приложения. Не питайте иллюзий, что сабж вам поможет писать быстрые приложения. ИМХО Последний раз редактировалось Iv; 07.03.2008 в 20:05. |
|
|||||
|
[+1 18.03.08]
Регистрация: Nov 2006
Сообщений: 223
|
Цитата:
![]() Использовался консольный компилятор из Flex 2 SDK. Кстати, хорошая идея! Надо проверить, в Flex 3 SDK, может быть что-то изменилось. Цитата:
Тем не менее, для того, чтобы оптимизировать, необходимо знать как влияют на быстродействие те или иные операции. Например, то, что вызов методов в AS3 происходит крайне медленно - это ведь тоже не с потолка взято, а опять же было проверено экспериментально. И, скажем, тот факт, что в AS1/AS2 использование x & 1 вместо x % 2 не давало никакого выигрыша, тоже кто-то когда-то проверил. Это я к тому, что методология методологией, но без знания быстродействия конкретных элементарных операций будет вообще непонятно КАК оптимизировать (за исключением оптимизации алгоритма, разумеется). |
![]() |
![]() |
Часовой пояс GMT +4, время: 02:22. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|