![]() |
Оптимизация: int vs uint, i+=1 vs i++ и т.д.
Провёл небольшое исследование.
1. Что лучше: int или uint, и почему вообще между ними есть разница. 2. Что лучше: i+=1 или i++. Исследование проводилось следующим образом. Нижеописанный класс был откомпилирован с помощью командного компилятора из Flex SDK (надо отметить, что компилятор Flash CS3 выдаёт те же результаты). Затем полученный .swf был декомпилирован с помощью abcdump из проекта Tamarin. Код:
package {Вот так выглядит присвоение x = 0: Поле int: Код:
findproperty private::aКод:
findproperty private::bКод:
pushbyte 0Код:
pushbyte 0Поле int: Код:
findpropstrict private::aКод:
findpropstrict private::bКод:
inclocal_i 1Код:
getlocal1 Поле int: Код:
findproperty private::aКод:
findproperty private::bКод:
getlocal1 Код:
getlocal1 Выводы: 1. Для полей нет разницы между int и uint (кроме области допустимых значений, разумеется). 2. При работе с локальными переменными типа uint часто используется инструкция конвертации convert_u, которая хоть и не значительно, но тем не менее может снизить произодительность. convert_i тоже иногда используется, но реже. 3. При работе с полями объекта выражение i+=1 компилируется в гораздо меньшее количество инструкций, чем i++ и выполняется значительно быстрее. 4. Наиболее быстрым выражением является i++ если i - это локальная переменная типа int. В этом случае выражение компилируется всего в одну инструкцию AVM2. Если i типа uint, то получается уже 4 инструкции. |
Занятненько...
Спасибо. |
Спасибо.
А я давно подозревал и везде использовал int вместо uint. uint только в константах. |
Не забывайте, что это разница в скорости актуальна при использовании полей класса, а не локальных переменных.
|
выигрыш/проигрыш производительности составляет настолько мизерную разницу, что я не могу привести реальный пример, где бы это сыграло хоть малейшую роль.
|
Спасибо. Интересно. На буржуйском сайте тайминг проводили - самый быстрый цикл выглядел следующим образом:
Код:
var i:int; |
Конечно, всё ещё во многом зависит от того, как байт-код будет переведён в нативнй код jit-компилятором.
Однако, здравый смысл подсказывает, что Код:
inclocal_i 1Код:
getlocal1 А колупать исходники AVM2 как-то не очень хочется :) |
Использовался Flex Builder 3 ?
|
Из классики:
На первом этапе программирования нужно сосредоточиться на правильной архитектуре приложения, читабельности кода, прозрачности и правильности логики. Только после окончания создания приложения следует протестировать производительность приложения, и только затем, на основании конкретных результатов тестов производить пошаговую оптимизацию, каждый раз обращая внимание на самые проблемные места кода. К чему это я свои 5 копеек в этот флейм тащу: Производительность конкретного кода цикла здесь обсуждается не в рамках единого процесса оптимизации, а как отдельная фишка. Боюсь, что знание методологии оптимизации кода в данном топике подменяется на следование ничему не значащим фактам. Почему не значащим? Потому, что один лишний вызов метода съест с лихвой всю экономию на всех циклах за всё время работы приложения. Не питайте иллюзий, что сабж вам поможет писать быстрые приложения. ИМХО |
Цитата:
Использовался консольный компилятор из Flex 2 SDK. Кстати, хорошая идея! Надо проверить, в Flex 3 SDK, может быть что-то изменилось. Цитата:
Тем не менее, для того, чтобы оптимизировать, необходимо знать как влияют на быстродействие те или иные операции. Например, то, что вызов методов в AS3 происходит крайне медленно - это ведь тоже не с потолка взято, а опять же было проверено экспериментально. И, скажем, тот факт, что в AS1/AS2 использование x & 1 вместо x % 2 не давало никакого выигрыша, тоже кто-то когда-то проверил. Это я к тому, что методология методологией, но без знания быстродействия конкретных элементарных операций будет вообще непонятно КАК оптимизировать (за исключением оптимизации алгоритма, разумеется). |
| Часовой пояс GMT +4, время: 08:47. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.