Форум 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=207963)

ZackMercury 27.05.2014 04:52

in4core, I4Logger? Я почитал статью, но там ничего про log level нет.

caseyryan 27.05.2014 08:36

По-моему где-то даже здесь на форуме была тема, где обсуждалось что лучше, побитовый сдвиг или деление по модулю в этом случае. Кто-то даже проводил тесты, и оказывалось, что деление по модулю в as3 быстрее.
Не смог найти ту тему, но если кому-то не в лом (мне в лом)) неплохо было бы провести тесты, чтобы проверить, а что на самом деле быстрее в as3

fish_r 27.05.2014 11:31

Вложений: 1
На самом деле разницы почти нет, вот один из тестов ( хром ):

Код:


Player:
Player type: PlugIn / release /


version: WIN 13,0,0,214



Test: su.fishr.tasks::BitwiseVsDivision



length array: 100 000 000

// x % 2
method:  modulo,  duration : 2 353 ms
// x * .5
method:  multiplyByHalf,  duration : 1 104 ms
// x / 2
method:  divideIntoTwo,  duration : 1 101 ms
// x >> 1
method:  bitwiseRigthShift,  duration : 1 113 ms



...end test


тестовый класс

Код AS3:

 
///********************************************************************
///* Copyright © 2014 fishr (fishr.flash@gmail.com) 
///********************************************************************
 
 
package su.fishr.tasks
{
 
        import flash.events.Event;
        import flash.events.EventDispatcher;
        import flash.globalization.NumberFormatter;
        import flash.utils.getTimer;
        import su.fishr.utils.ITask;
 
 
 
        /**
        * ...
        * @playerversion          Flash 10.1
        * @langversion            3.0
        * @author                fishr
        * @created                5/27/2014
        * @since                  5/27/2014
        */

        public  class BitwiseVsDivision extends EventDispatcher implements ITask
        {
        /**-------------------------------------------------------------------------------
        *
        *                                                          V A R I A B L E ' S       
        *
        * --------------------------------------------------------------------------------
        */

        //{
                static private const AUTHOR:String = "fishr (fishr.flash@gmail.com)";
                static public const TEST_COMPLETE:String = "testComplete";
                private var _valueData:Number = 100000000;
                private var _taskName:String;
                private var _result:String;
                private var _numFormater:NumberFormatter;
 
        //}
 
        /**-------------------------------------------------------------------------------
        *
        *                                                        P R O P E R T I E S       
        *
        * --------------------------------------------------------------------------------
        */

        //{
                /* INTERFACE su.fishr.utils.ITask */
 
                public function get result():String
                {
                        return _result;
                }
 
                public function get taskName():String
                {
                        return _taskName;
                }
 
                public function get valueData():Number
                {
                        return _valueData;
                }
 
                public function set numberFormater(value:NumberFormatter):void
                {
                        _numFormater = value;
                }
 
        //}
        /**-------------------------------------------------------------------------------
        *
        *                                                                P U B L I C       
        *
        * --------------------------------------------------------------------------------
        */

        //{
 
 
 
 
 
 
 
                public function start(valData:Number = 0):void
                {
                        if ( valData ) _valueData = valData;
 
                        var arr:Array = new Array();
 
                        while( arr.length < _valueData )
                        {
                                arr.push( arr.length + 2);
                        }
 
 
 
                        const methods:Array/*String*/ = [ "bitwiseRigthShift",
                                                                                                                        "divideIntoTwo",
                                                                                                                        "multiplyByHalf",
                                                                                                                        "modulo" ];
 
                        var length:int = arr.length;
 
 
                        const lenghtStr:String = _numFormater.formatInt( length);
 
 
                        _result = "length array: " + lenghtStr + "\r\r";
 
                        var startTime:int;
                        var finishTime:int;
 
                        var i:uint = methods.length;
                        while ( i-- )
                        {
                                startTime = getTimer();
                                this[ methods[ i ] ]( arr );
                                finishTime = getTimer();
 
                                const time:String =
                                _result += "method:  " +  methods[  i  ] + ",  duration : " + (  _numFormater.formatInt( ( finishTime - startTime ) ) ) + " ms \r";
 
                        }
 
                        _result += "\r...end test";
 
                        this.dispatchEvent( new Event( TEST_COMPLETE ) );
                }
        //}
 
        /**-------------------------------------------------------------------------------
        *
        *                                                                P R I V A T E       
        *
        * --------------------------------------------------------------------------------
        */
       
        //{
                private function bitwiseRigthShift( arr:Array/*int*/ ):void
                {
                        var h:uint = arr.length;
                        while ( h-- )
                        {
                                const res:int = arr[ h ] >> 1;
                        }
                }
 
                private function divideIntoTwo( arr:Array/*int*/ ):void
                {
                        var h:uint = arr.length;
                        while ( h-- )
                        {
                                const res:int = arr[ h ] / 2;
                        }
                }
 
                private function multiplyByHalf( arr:Array/*int*/ ):void
                {
                        var h:uint = arr.length;
                        while ( h-- )
                        {
                                const res:int = arr[ h ] *.5;
                        }
                }
 
                private function modulo( arr:Array/*int*/ ):void
                {
                        var h:uint = arr.length;
                        while ( h-- )
                        {
                                const res:int = arr[ h ] % 2;
                        }
                }
        //}
 
 
        }
 
}

SimpleTasksTester.swf   (34.5 Кб)

КорДум 27.05.2014 11:39

Эти тесты были актуальны на начало 2007 года, оттуда и все статьи про простейшие оптимизульки математических выражений пошли. Сейчас, как я понимаю, компилятор сам оптимизирует как надо. Исходя из этого код нужно писать так, чтобы он был понятен и человеку в том числе без насилований его мозга.

Psycho Tiger 27.05.2014 11:47

Меж тем >> 1 ещё и округляет.
Если не нужно округление – *0.5, если нужно – то >> 1 выглядит секси.

fish_r 27.05.2014 12:18

Вложений: 1
однако, если делимое имеет десятичную часть, то почему-то появляется разница, и она не в пользу сдвига, это у меня проявляется в хроме, только, но другие плеера дебаг-типа, поэтому не очень доверяю результату в них

Код:


Player:
Player type: PlugIn / release /
version: WIN 13,0,0,214

Test: su.fishr.tasks::BitwiseVsDivision

length array: 100 000 000

method:  modulo,  duration : 2 306 ms
method:  multiplyByHalf,  duration : 1 015 ms
method:  divideIntoTwo,  duration : 1 062 ms
method:  bitwiseRigthShift,  duration : 2 200 ms

...end test

SimpleTasksTester.swf   (34.5 Кб)

ZackMercury 27.05.2014 12:26

Всем спасибо, но лучше дайте ссыль, где можно почитать про log level? Что это и зачем?

Добавлено через 24 минуты
Цитата:

однако, если делимое имеет десятичную часть, то почему-то появляется разница, и она не в пользу сдвига
На сообщение выше
Цитата:

Меж тем >> 1 ещё и округляет.

fish_r 27.05.2014 13:53

в тестовом классе, посмотри, результат сообщается переменной типа int, т.е. десятичная часть отсекается полюбе, просто неявно, поэтому выражение int(x/2 ) будет "дешевле" чем x>>1

alexcon314 27.05.2014 22:13

Цитата:

Всем спасибо, но лучше дайте ссыль, где можно почитать про log level? Что это и зачем?
http://ru.wikipedia.org/wiki/Syslog - основа основ. Там нет упоминания термина level, есть severity и facility. Понятие level относится в основном к дебагу: чем выше уровень, тем больше сообщений будет выводиться в лог. Впрочем, есть еще такое понятие, как verbose :).
Собственно, нужно все это, очевидно, для того, чтобы оперативно выявлять проблемы в работе приложения, регулируя информативность логов в нужную сторону, по обстоятельствам, а также для того, чтобы иметь возможность автоматизировать процесс обработки логов. В некоторых системах библиотеках логирования существует более развернутые схемы настроек, например.
Есть и что-то по-легче (но не менее привлекательные по другим причинам, компактность, скажем). Так же некоторые фреймворки обладают собственными логгерами (внезапно). Разнообразие их довольно обширно.

Иногда, разработчики пишут логгеры самостоятельно :).

ZackMercury 28.05.2014 00:16

Спасибо за объяснение, теперь понятно.
Это цвет, плавно уходящий из синего к красному, тоесть LogLevel.FATAL будет красным рисовать, и отображать даже в режиме paused :) Но мне это не нужно, к сожалению. У меня цвета рассчитаны для отделения одной части приложения от другой. Могу сделать самый простой лог-левел, состоящий из 2-х типов, такой да, пригодится.


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

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