![]() |
|
||||||||||
|
|
|
|||||
|
По-моему где-то даже здесь на форуме была тема, где обсуждалось что лучше, побитовый сдвиг или деление по модулю в этом случае. Кто-то даже проводил тесты, и оказывалось, что деление по модулю в as3 быстрее.
Не смог найти ту тему, но если кому-то не в лом (мне в лом)) неплохо было бы провести тесты, чтобы проверить, а что на самом деле быстрее в as3
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
|
На самом деле разницы почти нет, вот один из тестов ( хром ):
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 тестовый класс ///******************************************************************** ///* 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; } } //} } } Последний раз редактировалось fish_r; 27.05.2014 в 12:24. |
|
|||||
|
Эти тесты были актуальны на начало 2007 года, оттуда и все статьи про простейшие оптимизульки математических выражений пошли. Сейчас, как я понимаю, компилятор сам оптимизирует как надо. Исходя из этого код нужно писать так, чтобы он был понятен и человеку в том числе без насилований его мозга.
__________________
тут я |
|
|||||
|
Меж тем >> 1 ещё и округляет.
Если не нужно округление – *0.5, если нужно – то >> 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 |
|
|||||
|
Всем спасибо, но лучше дайте ссыль, где можно почитать про log level? Что это и зачем?
Добавлено через 24 минуты Цитата:
Цитата:
__________________
There is no thing in this world that is not simple. Последний раз редактировалось ZackMercury; 27.05.2014 в 12:51. |
|
|||||
|
в тестовом классе, посмотри, результат сообщается переменной типа int, т.е. десятичная часть отсекается полюбе, просто неявно, поэтому выражение int(x/2 ) будет "дешевле" чем x>>1
Последний раз редактировалось fish_r; 27.05.2014 в 14:10. |
|
|||||
|
listener
|
Цитата:
.Собственно, нужно все это, очевидно, для того, чтобы оперативно выявлять проблемы в работе приложения, регулируя информативность логов в нужную сторону, по обстоятельствам, а также для того, чтобы иметь возможность автоматизировать процесс обработки логов. В некоторых Есть и что-то по-легче (но не менее привлекательные по другим причинам, компактность, скажем). Так же некоторые фреймворки обладают собственными логгерами (внезапно). Разнообразие их довольно обширно. Иногда, разработчики пишут логгеры самостоятельно .Последний раз редактировалось alexcon314; 27.05.2014 в 22:57. |
|
|||||
|
Спасибо за объяснение, теперь понятно.
Это цвет, плавно уходящий из синего к красному, тоесть LogLevel.FATAL будет красным рисовать, и отображать даже в режиме paused Но мне это не нужно, к сожалению. У меня цвета рассчитаны для отделения одной части приложения от другой. Могу сделать самый простой лог-левел, состоящий из 2-х типов, такой да, пригодится.
__________________
There is no thing in this world that is not simple. |
![]() |
![]() |
Часовой пояс GMT +4, время: 05:05. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|