|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
[+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; } } } Вот так выглядит присвоение 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,784
|
Не забывайте, что это разница в скорости актуальна при использовании полей класса, а не локальных переменных.
|
|
|||||
Регистрация: 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, время: 19:32. |
|
« Предыдущая тема | Следующая тема » |
|
|