FORKED

[最適化 Tips] Array, Vector 走査時に加算を行う際の処理速度の違い forked from: [最適化 Tips] Array, Vector 走査時に加算を行う際の処理速度の違い [diff(26)]

  1. // forked from muta244's [最適化 Tips] Array, Vector 走査時に加算を行う際の処理速度の違い
  2. package {
  3. import flash.display.*;
  4. import flash.geom.*;
  5. import flash.events.*;
  6. import flash.text.*;
  7. import flash.utils.*;
  8. public class Main extends Sprite
  9. {
  10.     static private const _NUM_TIMES:uint = 1000000;
  11.     
  12.     private function _init():void
  13.     {
  14.         _debug(
  15.             "各テスト " + _NUM_TIMES + " 回処理させた計算結果 [単位 : ミリ秒]\n" +
  16.             "(誤差は多少生じます)\n"
  17.         );
  18.         
  19.         var array:Array = [];
  20.         var vector1:Vector.<int> = new Vector.<int>(0false);
  21.         var vector2:Vector.<int> = new Vector.<int>(_NUM_TIMES, false);
  22.         var vector3:Vector.<int> = new Vector.<int>(_NUM_TIMES, true);
  23.         var unit : SLLUnit = new SLLUnit(0);
  24.         
  25.         for (var i:uint = 0; i < _NUM_TIMES; i++) {
  26.             array[i] = 0;
  27.             vector1[i] = 0;
  28.             unit = new SLLUnit(0, unit);
  29.         }
  30.         
  31.         _measure("ループのみ"function ():void
  32.         {
  33.             for (var i:uint = 0; i < _NUM_TIMES; i++) {
  34.                 
  35.             }
  36.         });
  37.         
  38.         _measure("Array の要素に加算処理"function ():void
  39.         {
  40.             var e:uint;
  41.             for (var i:uint = 0, l:uint = array.length; i < l; i++) {
  42.                 array[i]++;
  43.             }
  44.         });
  45.         
  46.         _measure("Vector.<int>(0, false) の要素に加算処理"function ():void
  47.         {
  48.             var e:uint;
  49.             for (var i:uint = 0, l:uint = vector1.length; i < l; i++) {
  50.                 vector1[i]++;
  51.             }
  52.         });
  53.         
  54.         _measure("Vector.<int>(" + _NUM_TIMES + ", false) の要素に加算処理"function ():void
  55.         {
  56.             var e:uint;
  57.             for (var i:uint = 0, l:uint = vector2.length; i < l; i++) {
  58.                 vector2[i]++;
  59.             }
  60.         });
  61.         
  62.         _measure("Vector.<int>(" + _NUM_TIMES + ", true) の要素に加算処理"function ():void
  63.         {
  64.             var e:uint;
  65.             for (var i:uint = 0, l:uint = vector3.length; i < l; i++) {
  66.                 vector3[i]++;
  67.             }
  68.         });
  69.         
  70.         // 直接参照なら高速だけど、間接にすると目も当てられなく・・
  71.         _measure("SLL(" + _NUM_TIMES + ") の要素に加算処理"function ():void
  72.         {
  73.             var u : SLLUnit = unit;
  74.             while(u = u._next){
  75.                 u._value++;
  76.             }
  77.         });
  78.         
  79.         _debug("\n結果については言及しませんので, 各自ご判断ください.");
  80.     }
  81.     
  82.     private var _field:TextField;
  83.     private var _time:uint;
  84.     
  85.     public function Main():void
  86.     {
  87.         _setup();
  88.         _init();
  89.     }
  90.     
  91.     private function _measure(title:String, func:Function, ...params):void
  92.     {
  93.         _time = getTimer();
  94.         func.apply(null, params);
  95.         _time = getTimer() - _time;
  96.         
  97.         _debug("[ " + title + " ] --> " + _time + " ms");
  98.     }
  99.     
  100.     private function _debug(log:String):void
  101.     {
  102.         _field.appendText(log + "\n");
  103.     }
  104.     
  105.     private function _setup():void
  106.     {
  107.         _field = new TextField();
  108.         _field.width = stage.stageWidth - 40;
  109.         _field.height = stage.stageHeight - 60;
  110.         _field.x = 20;
  111.         _field.y = 60;
  112.         _field.multiline = true;
  113.         _field.wordWrap = true;
  114.         
  115.         var format:TextFormat = _field.defaultTextFormat;
  116.         format.font = "_sans";
  117.         _field.defaultTextFormat = format;
  118.         
  119.         addChild(_field);
  120.         
  121.         var button:Sprite = new Sprite();
  122.         button.graphics.lineStyle(1, 0xBBBBBB);
  123.         button.graphics.beginFill(0xEEEEEE);
  124.         button.graphics.drawRoundRect(001002055);
  125.         button.graphics.endFill();
  126.         
  127.         addChild(button);
  128.         
  129.         button.x = 20;
  130.         button.y = 20;
  131.         button.mouseChildren = false;
  132.         button.buttonMode = true;
  133.         
  134.         var field:TextField = new TextField();
  135.         field.width = 100;
  136.         field.height = 20;
  137.         field.htmlText = "<p align='center'><font face='_sans'>再計算</span></p>";
  138.         
  139.         button.addChild(field);
  140.         
  141.         button.addEventListener(MouseEvent.CLICK, function ():void
  142.         {
  143.             _field.text = "";
  144.             _init();
  145.         });
  146.     }
  147. }
  148. }
  149. class SLLUnit
  150. {
  151.     public var _next : SLLUnit;
  152.     public var _value : int;
  153.     
  154.     public function SLLUnit(v : int, n : SLLUnit = null) : void { _next = n; _value = v; }
  155.     public function get next() : SLLUnit { return _next; }
  156.     public function set next(n : SLLUnit) : void { _next = n; }
  157.     
  158.     public function get value() : intreturn _value; }
  159.     public function set value(v : int) : void { _value = v;}
  160.     
  161. }
noswf

[最適化 Tips] Array, Vector 走査時に加算を行う際の処理速度の違い [最適化 Tips] 変数を参照する際の処理速度の違い [diff(74)]

  1. package {
  2. import flash.display.*;
  3. import flash.geom.*;
  4. import flash.events.*;
  5. import flash.text.*;
  6. import flash.utils.*;
  7. use namespace ns;
  8. public class Main extends Sprite
  9. {
  10.     static private const _NUM_TIMES:uint = 1000000;
  11.     
  12.     static private const PI:Number = Math.PI;
  13.     
  14.     private function get _getPi():Number
  15.     {
  16.         return _pi;
  17.     }
  18.     
  19.     private var _pi:Number = Math.PI;
  20.     ns var _pi:Number = Math.PI;
  21.     
  22.     private function _init():void
  23.     {
  24.         _debug(
  25.             "各テスト " + _NUM_TIMES + " 回処理させた計算結果 [単位 : ミリ秒]\n" +
  26.             "(誤差は多少生じます)\n"
  27.         );
  28.         
  29.         var pi:Number = Math.PI;
  30.         
  31.         _measure("ループのみ"function ():void
  32.         {
  33.             for (var i:int = 0; i < _NUM_TIMES; i++) {
  34.                 
  35.             }
  36.         });
  37.         
  38.         _measure("ビルトインクラスの静的変数 (Math.PI)"function ():void
  39.         {
  40.             for (var i:int = 0; i < _NUM_TIMES; i++) {
  41.                 Math.PI;
  42.             }
  43.         });
  44.         
  45.         _measure("オリジナルクラスの静的変数 (MyMath.PI)"function ():void
  46.         {
  47.             for (var i:int = 0; i < _NUM_TIMES; i++) {
  48.                 MyMath.PI;
  49.             }
  50.         });
  51.         
  52.         _measure("自クラスの静的変数 (Main.PI)"function ():void
  53.         {
  54.             for (var i:int = 0; i < _NUM_TIMES; i++) {
  55.                 Main.PI;
  56.             }
  57.         });
  58.         
  59.         _measure("自クラスの静的変数 (PI)"function ():void
  60.         {
  61.             for (var i:int = 0; i < _NUM_TIMES; i++) {
  62.                 PI;
  63.             }
  64.         });
  65.         
  66.         _measure("自クラスの getter メンバ (_getPi)"function ():void
  67.         {
  68.             for (var i:int = 0; i < _NUM_TIMES; i++) {
  69.                 _getPi;
  70.             }
  71.         });
  72.         
  73.         _measure("自クラスの private メンバ (_pi)"function ():void
  74.         {
  75.             for (var i:int = 0; i < _NUM_TIMES; i++) {
  76.                 _pi;
  77.             }
  78.         });
  79.         
  80.         _measure("自クラスの独自ネームスペースでのメンバ (ns::_pi)"function ():void
  81.         {
  82.             for (var i:int = 0; i < _NUM_TIMES; i++) {
  83.                 ns::_pi;
  84.             }
  85.         });
  86.         
  87.         _measure("ローカル変数 (pi)"function ():void
  88.         {
  89.             for (var i:int = 0; i < _NUM_TIMES; i++) {
  90.                 pi;
  91.             }
  92.         });
  93.         
  94.         _debug("\n結果については言及しませんので, 各自ご判断ください.");
  95.     }
  96.     
  97.     private var _field:TextField;
  98.     private var _time:uint;
  99.     
  100.     public function Main():void
  101.     {
  102.         _setup();
  103.         _init();
  104.     }
  105.     
  106.     private function _measure(title:String, func:Function, ...params):void
  107.     {
  108.         _time = getTimer();
  109.         func.apply(null, params);
  110.         _time = getTimer() - _time;
  111.         
  112.         _debug("[ " + title + " ] --> " + _time + " ms");
  113.     }
  114.     
  115.     private function _debug(log:String):void
  116.     {
  117.         _field.appendText(log + "\n");
  118.     }
  119.     
  120.     private function _setup():void
  121.     {
  122.         _field = new TextField();
  123.         _field.width = stage.stageWidth - 40;
  124.         _field.height = stage.stageHeight - 60;
  125.         _field.x = 20;
  126.         _field.y = 60;
  127.         _field.multiline = true;
  128.         _field.wordWrap = true;
  129.         
  130.         var format:TextFormat = _field.defaultTextFormat;
  131.         format.font = "_sans";
  132.         _field.defaultTextFormat = format;
  133.         
  134.         addChild(_field);
  135.         
  136.         var button:Sprite = new Sprite();
  137.         button.graphics.lineStyle(1, 0xBBBBBB);
  138.         button.graphics.beginFill(0xEEEEEE);
  139.         button.graphics.drawRoundRect(001002055);
  140.         button.graphics.endFill();
  141.         
  142.         addChild(button);
  143.         
  144.         button.x = 20;
  145.         button.y = 20;
  146.         button.mouseChildren = false;
  147.         button.buttonMode = true;
  148.         
  149.         var field:TextField = new TextField();
  150.         field.width = 100;
  151.         field.height = 20;
  152.         field.htmlText = "<p align='center'><font face='_sans'>再計算</span></p>";
  153.         
  154.         button.addChild(field);
  155.         
  156.         button.addEventListener(MouseEvent.CLICK, function ():void
  157.         {
  158.             _field.text = "";
  159.             _init();
  160.         });
  161.     }
  162. }
  163. }
  164. namespace ns = "original namespace";
  165. class MyMath
  166. {
  167.     static public const PI:Number = Math.PI;
  168. }
  169.     
noswf
Get Adobe Flash Player