![]() |
|
||||||||||
|
|||||
|
Регистрация: Nov 2010
Сообщений: 430
|
Здравствуйте.
Недавно копался в чужих исходниках и заметил, такую штуку: Иногда пишут а иногда Есть ли какая-нибудь разница в выполнении: Что-то быстрее или памяти меньше выделяется, или это просто стиль такой?
__________________
Лучше спросить и выставить себя дураком на пять минут, чем не спросить и остаться дураком на всю жизнь. |
|
|||||
|
Народ, когад вы научитесь такие вещи проверять. Тест занял 5 минут.
package { import flash.display.Sprite; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.utils.getTimer; /** * ... * @author Aquahawk */ public class Main extends Sprite { public function Main():void { var i:int; var start:Number; var tf:TextField = new TextField(); tf.autoSize = TextFieldAutoSize.LEFT; addChild(tf); start = getTimer(); for (i = 0; i < 10000000; i++ ) { Math.PI / 2; } tf.appendText(getTimer() - start + "\n"); start = getTimer(); for (i = 0; i < 10000000; i++ ) { 0.5*Math.PI; } tf.appendText(getTimer() - start + "\n"); start = getTimer(); for (i = 0; i < 10000000; i++ ) { Math.PI / 2; } tf.appendText(getTimer() - start + "\n"); start = getTimer(); for (i = 0; i < 10000000; i++ ) { 0.5*Math.PI; } tf.appendText(getTimer() - start + "\n"); } } } это в релизе. Разницы никакой. На миллионе итераций. Писать надо так что было понятно, а скорость выигрывать алгоритмически. Можно ещё целые числа на 2 делить и умножать сдвигом влево-вправо, только зачем?
__________________
:) |
|
|||||
|
Modus ponens
|
Это тема не из С++, это объективное наблюдение - процессор не умеет выполнять арифметические действия, только сдвиги и маски (ну, это своего рода преувеличение, т.как можно сказать, что умеет, но в конечном счете все арифметические операции реализованы сдвигами и побитовым сложением / масками).
Реализация деления объективно более громоздкая, чем умножения. А сложение - еще проще, чем умножение. Т.е. сложить 2 одинаковых числа - быстрее, чем умножить на 2. Но существует очень и очень много оговорорк. Т.как мы не пишем в AS код который непосредственно выполняется процессором, мы можем не знать каких-то деталей. А деталей, на самом деле, куча. - во Флеше нет арифметических опреаций для целых чисел, только для чисел с плавающей запятой с последующим приведением типов. Реализация арифметики для таких чисел отличается от целочисленных операций. - Флешевый байткод компилируется в машинный код специальным компилятором, который может делать оптимизации для конкретной архитектуры на которой код выполняется. Так что тест приведенный выше может дать и совсем другие результаты на другом типе процессора, другой битности системы и т.д. - более того, некоторые процессоры, на уровне процессора (даже не машинного кода!) могут делать специальные оптимизации для часто встречающихся операций. Например, умножение на константу может быть быстрее умножения на переменную. Кроме того, умножение и деление могут быть реализованы с переменной скоростью. Даже сложение можно реализовать за разное количество тактов (вариант когда можно сложить за меньшее количество тактов изначально проанализировав числа и применив обычное побитовое или вместо длинной рутины) и т.п. - еще, у чисел с плавающей запятой есть свои более и менее "удачные" области. например числа с очень маленькой дробной частью ведут себя гораздо хуже при арифметичсеких операциях, чем числа того же порядка но "целые". - еще к этому можно добавить, что система выполняющая тест почти наверняка параллельно выполняет что-то еще, и в зависимости от "чего-то еще" нагрузка на соответствующие участки процессора может быть другой. Подытожив: мы на столько не в состоянии судить о разнице между аналогичными операциями, что лучше не задумываться о том, что быстрее - информация полученая на тестах скорее всего случайна. Главоне - между оператором и именами переменных должны быть пробелы. Вот это по-настоящему доводит до белого каления человка, которому это потом читать. Остальное не имеет значения.
__________________
Hell is the possibility of sanity |
|
|||||
|
wvxvw, абсолютно прав. Это не та "оптимизация" над которой стоит задумываться.
|
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Зато оптимизация чтения кода имеет смысл. Я лично пишу "/ 2".
__________________
Reality.getBounds(this); |
![]() |
![]() |
Часовой пояс GMT +4, время: 16:17. |
|
|
« Предыдущая тема | Следующая тема » |
|
|