Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Стиль написания: * или / (http://www.flasher.ru/forum/showthread.php?t=178027)

Srednas 13.04.2012 13:39

Стиль написания: * или /
 
Здравствуйте.

Недавно копался в чужих исходниках и заметил, такую штуку:
Иногда пишут
Код AS3:

Math.PI/2

а иногда
Код AS3:

0.5*Math.PI

Есть ли какая-нибудь разница в выполнении: Что-то быстрее или памяти меньше выделяется, или это просто стиль такой?

Aquahawk 13.04.2012 13:44

может привычка из C/C++, там для целых чисел a/2 и 0.5*a дают разные результаты.

Astraport 13.04.2012 13:56

Говорят * быстрее.

Aquahawk 13.04.2012 14:07

Народ, когад вы научитесь такие вещи проверять. Тест занял 5 минут.
Код AS3:

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");
                }
        }
}

Код:

62
64
64
77

Добавлено через 1 минуту
это в релизе. Разницы никакой. На миллионе итераций. Писать надо так что было понятно, а скорость выигрывать алгоритмически. Можно ещё целые числа на 2 делить и умножать сдвигом влево-вправо, только зачем?

gloomyBrain 13.04.2012 14:12

Какой-то странный тест. Тесты нужно начинать по клику, ибо в первые 10 секунд FP "разогревается" и работает весьма странно

Aquahawk 13.04.2012 14:40

Есть такое, не сказал бы что 10 секунд, но именно поэтому испытания проведены дважды и чередуются. Кто хочет может добавить старт по клику, на это уйдёт ещё одна минута

in4core 13.04.2012 14:41

Тут даже чисто интуитивно. Смотрите :
1.4 * 1.5 = 2.1 посчитали быстро? ) круто
2.1 / 1.5 = 1.4 ... а тут уже в уме считать в разы сложнее...

wvxvw 13.04.2012 17:06

Это тема не из С++, это объективное наблюдение - процессор не умеет выполнять арифметические действия, только сдвиги и маски (ну, это своего рода преувеличение, т.как можно сказать, что умеет, но в конечном счете все арифметические операции реализованы сдвигами и побитовым сложением / масками).
Реализация деления объективно более громоздкая, чем умножения. А сложение - еще проще, чем умножение. Т.е. сложить 2 одинаковых числа - быстрее, чем умножить на 2. Но существует очень и очень много оговорорк. Т.как мы не пишем в AS код который непосредственно выполняется процессором, мы можем не знать каких-то деталей. А деталей, на самом деле, куча.
- во Флеше нет арифметических опреаций для целых чисел, только для чисел с плавающей запятой с последующим приведением типов. Реализация арифметики для таких чисел отличается от целочисленных операций.
- Флешевый байткод компилируется в машинный код специальным компилятором, который может делать оптимизации для конкретной архитектуры на которой код выполняется. Так что тест приведенный выше может дать и совсем другие результаты на другом типе процессора, другой битности системы и т.д.
- более того, некоторые процессоры, на уровне процессора (даже не машинного кода!) могут делать специальные оптимизации для часто встречающихся операций. Например, умножение на константу может быть быстрее умножения на переменную. Кроме того, умножение и деление могут быть реализованы с переменной скоростью. Даже сложение можно реализовать за разное количество тактов (вариант когда можно сложить за меньшее количество тактов изначально проанализировав числа и применив обычное побитовое или вместо длинной рутины) и т.п.
- еще, у чисел с плавающей запятой есть свои более и менее "удачные" области. например числа с очень маленькой дробной частью ведут себя гораздо хуже при арифметичсеких операциях, чем числа того же порядка но "целые".
- еще к этому можно добавить, что система выполняющая тест почти наверняка параллельно выполняет что-то еще, и в зависимости от "чего-то еще" нагрузка на соответствующие участки процессора может быть другой.

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

Главоне - между оператором и именами переменных должны быть пробелы. Вот это по-настоящему доводит до белого каления человка, которому это потом читать. Остальное не имеет значения.

ramshteks 13.04.2012 20:09

wvxvw, абсолютно прав. Это не та "оптимизация" над которой стоит задумываться.

Wolsh 13.04.2012 21:26

Зато оптимизация чтения кода имеет смысл. Я лично пишу "/ 2".


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

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