最適化tips
performance tips
これは新発見
performancetipsworkaroundsint is faster than: floor, round, >>
intのキャストが意外とはやい
performanceMath.floor(*)はやっぱ遅い。ビットシフトがいいと思ってたけど、intキャストが速いっぽい。n|0も試してみたもののn>>0とほぼ同じだった。
[最適化 Tips] 色々な整数化手段での処理速度の違い 小数点以下四捨五入の処理速度実験
- // forked from muta244's [最適化 Tips] 色々な整数化手段での処理速度の違い
- /**
- *
- * http://tech.ckme.co.jp/cpp/cpp_round.shtml
- * を参考にしました。
- *
- */
- package {
- import flash.display.*;
- import flash.events.*;
- import flash.text.*;
- import flash.utils.*;
- public class Main extends Sprite
- {
- static private const _NUM_TIMES:uint = 1000000;
- private function _init():void
- {
- _debug(
- "各テスト " + _NUM_TIMES + " 回処理させた計算結果 [単位 : ミリ秒]\n" +
- "(誤差は多少生じます)\n"
- );
- var n:Number = Math.PI;
- var round:Function = Math.round;
- _measure("ループのみ", function ():void
- {
- for (var i:uint = 0; i < _NUM_TIMES; i++) {
- }
- });
- _measure("Math.random() * 2 - 1 のみ", function ():void
- {
- for (var i:uint = 0; i < _NUM_TIMES; i++) {
- n = Math.random() * 2 - 1;
- }
- });
- _measure("Math.round(n) で四捨五入", function ():void
- {
- for (var i:uint = 0; i < _NUM_TIMES; i++) {
- n = Math.random() * 2 - 1;
- Math.round(n);
- }
- });
- _measure("ローカル変数の round(n) で四捨五入", function ():void
- {
- for (var i:uint = 0; i < _NUM_TIMES; i++) {
- n = Math.random() * 2 - 1;
- round(n);
- }
- });
- _measure("(n > 0 ? int(n+0.5) : int(n - 0.5)) で四捨五入", function ():void
- {
- for (var i:uint = 0; i < _NUM_TIMES; i++) {
- n = Math.random() * 2 - 1;
- (n > 0 ? int(n+0.5) : int(n - 0.5));
- }
- });
- _measure("int(n+0.5-int(n<0)) で四捨五入", function ():void
- {
- for (var i:uint = 0; i < _NUM_TIMES; i++) {
- n = Math.random() * 2 - 1;
- int(n+0.5-int(n<0));
- }
- });
- _debug("\n結果については言及しませんので, 各自ご判断ください.");
- }
- private var _field:TextField;
- private var _time:uint;
- public function Main():void
- {
- _setup();
- _init();
- }
- private function _measure(title:String, func:Function, ...params):void
- {
- _time = getTimer();
- func.apply(null, params);
- _time = getTimer() - _time;
- _debug("[ " + title + " ] --> " + _time + " ms");
- }
- private function _debug(log:String):void
- {
- _field.appendText(log + "\n");
- }
- private function _setup():void
- {
- _field = new TextField();
- _field.width = stage.stageWidth - 40;
- _field.height = stage.stageHeight - 60;
- _field.x = 20;
- _field.y = 60;
- _field.multiline = true;
- _field.wordWrap = true;
- var format:TextFormat = _field.defaultTextFormat;
- format.font = "_sans";
- _field.defaultTextFormat = format;
- addChild(_field);
- var button:Sprite = new Sprite();
- button.graphics.lineStyle(1, 0xBBBBBB);
- button.graphics.beginFill(0xEEEEEE);
- button.graphics.drawRoundRect(0, 0, 100, 20, 5, 5);
- button.graphics.endFill();
- addChild(button);
- button.x = 20;
- button.y = 20;
- button.mouseChildren = false;
- button.buttonMode = true;
- var field:TextField = new TextField();
- field.width = 100;
- field.height = 20;
- field.htmlText = "<p align='center'><font face='_sans'>再計算</span></p>";
- button.addChild(field);
- button.addEventListener(MouseEvent.CLICK, function ():void
- {
- _field.text = "";
- _init();
- });
- }
- }
- }
[最適化 Tips] 色々な整数化手段での処理速度の違い forked from: [最適化 Tips] 色々な整数化手段での処理速度の違い
- // forked from muta244's [最適化 Tips] 色々な整数化手段での処理速度の違い
- package {
- import flash.display.*;
- import flash.events.*;
- import flash.text.*;
- import flash.utils.*;
- public class Main extends Sprite
- {
- static private const _NUM_TIMES:uint = 1000000;
- private function _init():void
- {
- _debug(
- "各テスト " + _NUM_TIMES + " 回処理させた計算結果 [単位 : ミリ秒]\n" +
- "(誤差は多少生じます)\n"
- );
- var n:Number = Math.PI;
- _measure("Math.floor(n) で整数化(var i:int)", function ():void
- {
- for (var i:int = 0; i < _NUM_TIMES; i++) {
- Math.floor(n);
- }
- });
- _measure("Math.floor(n) で整数化(var i:uint)", function ():void
- {
- for (var i:uint = 0; i < _NUM_TIMES; i++) {
- Math.floor(n);
- }
- });
- _measure("n >> 0 で整数化(var i:int)", function ():void
- {
- for (var i:int = 0; i < _NUM_TIMES; i++) {
- n >> 0;
- }
- });
- _measure("n >> 0 で整数化(var i:uint)", function ():void
- {
- for (var i:uint = 0; i < _NUM_TIMES; i++) {
- n >> 0;
- }
- });
- _measure("n | 0 で整数化(var i:int)", function ():void
- {
- for (var i:int = 0; i < _NUM_TIMES; i++) {
- n | 0;
- }
- });
- _measure("n | 0 で整数化(var i:uint)", function ():void
- {
- for (var i:uint = 0; i < _NUM_TIMES; i++) {
- n | 0;
- }
- });
- _measure("int(n) で整数化(var i:int)", function ():void
- {
- for (var i:int = 0; i < _NUM_TIMES; i++) {
- int(n);
- }
- });
- _measure("int(n) で整数化(var i:uint)", function ():void
- {
- for (var i:uint = 0; i < _NUM_TIMES; i++) {
- int(n);
- }
- });
- _measure("uint(n) で整数化(var i:int)", function ():void
- {
- for (var i:int = 0; i < _NUM_TIMES; i++) {
- uint(n);
- }
- });
- _measure("uint(n) で整数化(var i:uint)", function ():void
- {
- for (var i:uint = 0; i < _NUM_TIMES; i++) {
- uint(n);
- }
- });
- _debug("\n結果については言及しませんので, 各自ご判断ください.");
- }
- private var _field:TextField;
- private var _time:uint;
- public function Main():void
- {
- _setup();
- _init();
- }
- private function _measure(title:String, func:Function, ...params):void
- {
- _time = getTimer();
- func.apply(null, params);
- _time = getTimer() - _time;
- _debug("[ " + title + " ] --> " + _time + " ms");
- }
- private function _debug(log:String):void
- {
- _field.appendText(log + "\n");
- }
- private function _setup():void
- {
- _field = new TextField();
- _field.width = stage.stageWidth - 40;
- _field.height = stage.stageHeight - 60;
- _field.x = 20;
- _field.y = 60;
- _field.multiline = true;
- _field.wordWrap = true;
- var format:TextFormat = _field.defaultTextFormat;
- format.font = "_sans";
- _field.defaultTextFormat = format;
- addChild(_field);
- var button:Sprite = new Sprite();
- button.graphics.lineStyle(1, 0xBBBBBB);
- button.graphics.beginFill(0xEEEEEE);
- button.graphics.drawRoundRect(0, 0, 100, 20, 5, 5);
- button.graphics.endFill();
- addChild(button);
- button.x = 20;
- button.y = 20;
- button.mouseChildren = false;
- button.buttonMode = true;
- var field:TextField = new TextField();
- field.width = 100;
- field.height = 20;
- field.htmlText = "<p align='center'><font face='_sans'>再計算</span></p>";
- button.addChild(field);
- button.addEventListener(MouseEvent.CLICK, function ():void
- {
- _field.text = "";
- _init();
- });
- }
- }
- }
[最適化 Tips] 色々な整数化手段での処理速度の違い [最適化 Tips] オブジェクト生成による処理速度の違い
- package {
- import flash.display.*;
- import flash.geom.*;
- import flash.events.*;
- import flash.text.*;
- import flash.utils.*;
- public class Main extends Sprite
- {
- static private const _NUM_TIMES:uint = 50000;
- private function _init():void
- {
- _debug(
- "各テスト " + _NUM_TIMES + " 回処理させた計算結果 [単位 : ミリ秒]\n" +
- "(誤差は多少生じます)\n"
- );
- var object:Object;
- var array:Array;
- _measure("ループのみ", function ():void
- {
- for (var i:uint = 0; i < _NUM_TIMES; i++) {
- }
- });
- _measure("new Object() で生成", function ():void
- {
- for (var i:uint = 0; i < _NUM_TIMES; i++) {
- var object:Object = new Object();
- }
- });
- _measure("{} で生成", function ():void
- {
- for (var i:uint = 0; i < _NUM_TIMES; i++) {
- var object:Object = {};
- }
- });
- _measure("new Array() で生成", function ():void
- {
- for (var i:uint = 0; i < _NUM_TIMES; i++) {
- var array:Array = new Array();
- }
- });
- _measure("[] で生成", function ():void
- {
- for (var i:uint = 0; i < _NUM_TIMES; i++) {
- var array:Array = [];
- }
- });
- _measure("new Vector.<int>() で生成", function ():void
- {
- for (var i:uint = 0; i < _NUM_TIMES; i++) {
- var vector:Vector.<int> = new Vector.<int>();
- }
- });
- _measure("new Vector.<int>(0, true) で生成", function ():void
- {
- for (var i:uint = 0; i < _NUM_TIMES; i++) {
- var vector:Vector.<int> = new Vector.<int>(0, true);
- }
- });
- _measure("new Vector.<int>(1000, true) で生成", function ():void
- {
- for (var i:uint = 0; i < _NUM_TIMES; i++) {
- var vector:Vector.<int> = new Vector.<int>(1000, true);
- }
- });
- _measure("new Vector.<int>(2000, true) で生成", function ():void
- {
- for (var i:uint = 0; i < _NUM_TIMES; i++) {
- var vector:Vector.<int> = new Vector.<int>(2000, true);
- }
- });
- _measure("new Point() で生成", function ():void
- {
- for (var i:uint = 0; i < _NUM_TIMES; i++) {
- var point:Point = new Point();
- }
- });
- _measure("new Rectangle() で生成", function ():void
- {
- for (var i:uint = 0; i < _NUM_TIMES; i++) {
- var rectangle:Rectangle = new Rectangle();
- }
- });
- _measure("new Matrix() で生成", function ():void
- {
- for (var i:uint = 0; i < _NUM_TIMES; i++) {
- var matrix:Matrix = new Matrix();
- }
- });
- _measure("new Sprite() で生成", function ():void
- {
- for (var i:uint = 0; i < _NUM_TIMES; i++) {
- var sprite:Sprite = new Sprite();
- }
- });
- _measure("new Test() で独自クラス生成", function ():void
- {
- for (var i:uint = 0; i < _NUM_TIMES; i++) {
- var test:Test = new Test();
- }
- });
- _debug("\n結果については言及しませんので, 各自ご判断ください.");
- }
- private var _field:TextField;
- private var _time:uint;
- public function Main():void
- {
- _setup();
- _init();
- }
- private function _measure(title:String, func:Function, ...params):void
- {
- _time = getTimer();
- func.apply(null, params);
- _time = getTimer() - _time;
- _debug("[ " + title + " ] --> " + _time + " ms");
- }
- private function _debug(log:String):void
- {
- _field.appendText(log + "\n");
- }
- private function _setup():void
- {
- _field = new TextField();
- _field.width = stage.stageWidth - 40;
- _field.height = stage.stageHeight - 60;
- _field.x = 20;
- _field.y = 60;
- _field.multiline = true;
- _field.wordWrap = true;
- var format:TextFormat = _field.defaultTextFormat;
- format.font = "_sans";
- _field.defaultTextFormat = format;
- addChild(_field);
- var button:Sprite = new Sprite();
- button.graphics.lineStyle(1, 0xBBBBBB);
- button.graphics.beginFill(0xEEEEEE);
- button.graphics.drawRoundRect(0, 0, 100, 20, 5, 5);
- button.graphics.endFill();
- addChild(button);
- button.x = 20;
- button.y = 20;
- button.mouseChildren = false;
- button.buttonMode = true;
- var field:TextField = new TextField();
- field.width = 100;
- field.height = 20;
- field.htmlText = "<p align='center'><font face='_sans'>再計算</span></p>";
- button.addChild(field);
- button.addEventListener(MouseEvent.CLICK, function ():void
- {
- _field.text = "";
- _init();
- });
- }
- }
- }
- internal class Test
- {
- }
notice:


