|
|
|||||
По-моему где-то даже здесь на форуме была тема, где обсуждалось что лучше, побитовый сдвиг или деление по модулю в этом случае. Кто-то даже проводил тесты, и оказывалось, что деление по модулю в 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 года, оттуда и все статьи про простейшие оптимизульки математических выражений пошли. Сейчас, как я понимаю, компилятор сам оптимизирует как надо. Исходя из этого код нужно писать так, чтобы он был понятен и человеку в том числе без насилований его мозга.
__________________
тут я |
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
Меж тем >> 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, время: 18:12. |
|
« Предыдущая тема | Следующая тема » |
|
|