FAVORITE BY
:
tipsperformance tips
:
FORKED

[最適化 Tips] Array, Vector 走査時のイテレーション方法による処理速度の違い forked from: [最適化 Tips] Array, Vector 走査時のイテレ方別処理速度 [diff(80)]

  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.         
  24.         for (var i:uint = 0; i < _NUM_TIMES; i++) {
  25.             array[i] = 0;
  26.             vector1[i] = 0;
  27.         }
  28.         
  29.         _measure("ループのみ"function ():void
  30.         {
  31.             for (var i:int = 0; i < _NUM_TIMES; i++) {
  32.                 
  33.             }
  34.         });
  35.         
  36.         _measure("Array を for で処理"function ():void
  37.         {
  38.             var e:int;
  39.             for (var i:uint = 0, l:uint = array.length; i < l; i++) {
  40.                 e = array[i];
  41.             }
  42.         });
  43.         _measure("Array を for(++i)で処理【追加】"function ():void
  44.         {
  45.             var e:int;
  46.             for (var i:uint = 0, l:uint = array.length; i < l; ++i) {
  47.                 e = array[i];
  48.             }
  49.         });
  50.         _measure("Array を for(const len)で処理【追加】"function ():void
  51.         {
  52.             var e:int;
  53.             const l:uint = array.length;
  54.             for (var i:uint = 0; i < l; i++) {
  55.                 e = array[i];
  56.             }
  57.         });
  58.         _measure("Array を for(++i、const len)で処理【追加】"function ():void
  59.         {
  60.             var e:int;
  61.             const l:uint = array.length;
  62.             for (var i:uint = 0; i < l; ++i) {
  63.                 e = array[i];
  64.             }
  65.         });
  66.         
  67.         _measure("Array を for each で処理"function ():void
  68.         {
  69.             for each (var e:int in array) {
  70.                 
  71.             }
  72.         });
  73.         _measure("Array を forEach で処理"function ():void
  74.         {
  75.             array.forEach(function (e:int, i:int, elements:Array):void
  76.             {
  77.                 
  78.             });
  79.         });
  80.         _measure("Array を forEach(const Function)で処理【追加】"function ():void
  81.         {
  82.             const fnc:Function = array.forEach;
  83.             fnc(function (e:int, i:int, elements:Array):void
  84.             {
  85.                 
  86.             });
  87.         });
  88.         
  89.         _measure("Vector.<int>(0, false) を for で処理"function ():void
  90.         {
  91.             var e:int;
  92.             for (var i:uint = 0, l:uint = vector1.length; i < l; i++) {
  93.                 e = vector1[i];
  94.             }
  95.         });
  96.         _measure("Vector.<int>(0, false) を for(++i)で処理【追加】"function ():void
  97.         {
  98.             var e:int;
  99.             for (var i:uint = 0, l:uint = vector1.length; i < l; ++i) {
  100.                 e = vector1[i];
  101.             }
  102.         });
  103.         
  104.         _measure("Vector.<int>(0, false) を for each で処理"function ():void
  105.         {
  106.             for each (var e:int in vector1) {
  107.                 
  108.             }
  109.         });
  110.         
  111.         _measure("Vector.<int>(0, false) を forEach で処理"function ():void
  112.         {
  113.             vector1.forEach(function (e:uint, i:uint, elements:Vector.<int>):void
  114.             {
  115.                 
  116.             });
  117.         });
  118.         
  119.         _measure("Vector.<int>(0, false) を forEach(const Function)で処理【追加】"function ():void
  120.         {
  121.             const fnc:Function = vector1.forEach;
  122.             fnc(function (e:uint, i:uint, elements:Vector.<int>):void
  123.             {
  124.                 
  125.             });
  126.         });
  127.         
  128.         _debug("\n結果については言及しませんので, 各自ご判断ください.");
  129.     }
  130.     
  131.     private var _field:TextField;
  132.     private var _time:uint;
  133.     
  134.     public function Main():void
  135.     {
  136.         _setup();
  137.         _init();
  138.     }
  139.     
  140.     private function _measure(title:String, func:Function, ...params):void
  141.     {
  142.         _time = getTimer();
  143.         func.apply(null, params);
  144.         _time = getTimer() - _time;
  145.         
  146.         _debug("[ " + title + " ] --> " + _time + " ms");
  147.     }
  148.     
  149.     private function _debug(log:String):void
  150.     {
  151.         _field.appendText(log + "\n");
  152.     }
  153.     
  154.     private function _setup():void
  155.     {
  156.         _field = new TextField();
  157.         _field.width = stage.stageWidth - 40;
  158.         _field.height = stage.stageHeight - 60;
  159.         _field.x = 20;
  160.         _field.y = 60;
  161.         _field.multiline = true;
  162.         _field.wordWrap = true;
  163.         
  164.         var format:TextFormat = _field.defaultTextFormat;
  165.         format.font = "_sans";
  166.         _field.defaultTextFormat = format;
  167.         
  168.         addChild(_field);
  169.         
  170.         var button:Sprite = new Sprite();
  171.         button.graphics.lineStyle(1, 0xBBBBBB);
  172.         button.graphics.beginFill(0xEEEEEE);
  173.         button.graphics.drawRoundRect(001002055);
  174.         button.graphics.endFill();
  175.         
  176.         addChild(button);
  177.         
  178.         button.x = 20;
  179.         button.y = 20;
  180.         button.mouseChildren = false;
  181.         button.buttonMode = true;
  182.         
  183.         var field:TextField = new TextField();
  184.         field.width = 100;
  185.         field.height = 20;
  186.         field.htmlText = "<p align='center'><font face='_sans'>再計算</span></p>";
  187.         
  188.         button.addChild(field);
  189.         
  190.         button.addEventListener(MouseEvent.CLICK, function ():void
  191.         {
  192.             _field.text = "";
  193.             _init();
  194.         });
  195.     }
  196. }
  197. }
noswf

[最適化 Tips] Array, Vector 走査時のイテレーション方法による処理速度の違い forked from: [最適化 Tips] Array, Vector 走査時のイテレーション方法による処理速度の違い [diff(1)]

  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.         
  24.         for (var i:int = 0; i < _NUM_TIMES; i++) {
  25.             array[i] = 0;
  26.             vector1[i] = 0;
  27.         }
  28.         
  29.         _measure("Array を for で処理"function ():void
  30.         {
  31.             var e:int;
  32.             for (var i:int = 0, l:int = array.length; i < l; i++) {
  33.                 e = array[i];
  34.             }
  35.         });
  36.         
  37.         _measure("Array を for each で処理"function ():void
  38.         {
  39.             for each (var e:int in array) {
  40.                 
  41.             }
  42.         });
  43.         
  44.         _measure("Array を forEach で処理"function ():void
  45.         {
  46.             array.forEach(function (e:int, i:int, elements:Array):void
  47.             {
  48.                 
  49.             });
  50.         });
  51.         
  52.         _measure("Vector.<int>(0, false) を for で処理"function ():void
  53.         {
  54.             var e:int;
  55.             for (var i:int = 0, l:int = vector1.length; i < l; i++) {
  56.                 e = vector1[i];
  57.             }
  58.         });
  59.         
  60.         _measure("Vector.<int>(0, false) を for each で処理"function ():void
  61.         {
  62.             for each (var e:int in vector1) {
  63.                 
  64.             }
  65.         });
  66.         
  67.         _measure("Vector.<int>(0, false) を forEach で処理"function ():void
  68.         {
  69.             vector1.forEach(function (e:int, i:int, elements:Vector.<int>):void
  70.             {
  71.                 
  72.             });
  73.         });
  74.         
  75.         _measure("Vector.<int>(" + _NUM_TIMES + ", false) を for で処理"function ():void
  76.         {
  77.             var e:int;
  78.             for (var i:int = 0, l:int = vector2.length; i < l; i++) {
  79.                 e = vector2[i];
  80.             }
  81.         });
  82.         
  83.         _measure("Vector.<int>(" + _NUM_TIMES + ", false) を for each で処理"function ():void
  84.         {
  85.             for each (var e:int in vector2) {
  86.                 
  87.             }
  88.         });
  89.         
  90.         _measure("Vector.<int>(" + _NUM_TIMES + ", false) を forEach で処理"function ():void
  91.         {
  92.             vector2.forEach(function (e:int, i:int, elements:Vector.<int>):void
  93.             {
  94.                 
  95.             });
  96.         });
  97.         
  98.         _measure("Vector.<int>(" + _NUM_TIMES + ", true) を for で処理"function ():void
  99.         {
  100.             var e:int;
  101.             for (var i:int = 0, l:int = vector3.length; i < l; i++) {
  102.                 e = vector3[i];
  103.             }
  104.         });
  105.         
  106.         _measure("Vector.<int>(" + _NUM_TIMES + ", true) を for each で処理"function ():void
  107.         {
  108.             for each (var e:int in vector3) {
  109.                 
  110.             }
  111.         });
  112.         
  113.         _measure("Vector.<int>(" + _NUM_TIMES + ", true) を forEach で処理"function ():void
  114.         {
  115.             vector3.forEach(function (e:int, i:int, elements:Vector.<int>):void
  116.             {
  117.                 
  118.             });
  119.         });
  120.         
  121.         _debug("\n結果については言及しませんので, 各自ご判断ください.");
  122.     }
  123.     
  124.     private var _field:TextField;
  125.     private var _time:uint;
  126.     
  127.     public function Main():void
  128.     {
  129.         _setup();
  130.         _init();
  131.     }
  132.     
  133.     private function _measure(title:String, func:Function, ...params):void
  134.     {
  135.         _time = getTimer();
  136.         func.apply(null, params);
  137.         _time = getTimer() - _time;
  138.         
  139.         _debug("[ " + title + " ] --> " + _time + " ms");
  140.     }
  141.     
  142.     private function _debug(log:String):void
  143.     {
  144.         _field.appendText(log + "\n");
  145.     }
  146.     
  147.     private function _setup():void
  148.     {
  149.         _field = new TextField();
  150.         _field.width = stage.stageWidth - 40;
  151.         _field.height = stage.stageHeight - 60;
  152.         _field.x = 20;
  153.         _field.y = 60;
  154.         _field.multiline = true;
  155.         _field.wordWrap = true;
  156.         
  157.         var format:TextFormat = _field.defaultTextFormat;
  158.         format.font = "_sans";
  159.         _field.defaultTextFormat = format;
  160.         
  161.         addChild(_field);
  162.         
  163.         var button:Sprite = new Sprite();
  164.         button.graphics.lineStyle(1, 0xBBBBBB);
  165.         button.graphics.beginFill(0xEEEEEE);
  166.         button.graphics.drawRoundRect(001002055);
  167.         button.graphics.endFill();
  168.         
  169.         addChild(button);
  170.         
  171.         button.x = 20;
  172.         button.y = 20;
  173.         button.mouseChildren = false;
  174.         button.buttonMode = true;
  175.         
  176.         var field:TextField = new TextField();
  177.         field.width = 100;
  178.         field.height = 20;
  179.         field.htmlText = "<p align='center'><font face='_sans'>再計算</span></p>";
  180.         
  181.         button.addChild(field);
  182.         
  183.         button.addEventListener(MouseEvent.CLICK, function ():void
  184.         {
  185.             _field.text = "";
  186.             _init();
  187.         });
  188.     }
  189. }
  190. }
noswf

[最適化 Tips] Array, Vector 走査時のイテレーション方法による処理速度の違い [最適化 Tips] Array, Vector 走査時に加算を行う際の処理速度の違い [diff(73)]

  1. package {
  2. import flash.display.*;
  3. import flash.geom.*;
  4. import flash.events.*;
  5. import flash.text.*;
  6. import flash.utils.*;
  7. public class Main extends Sprite
  8. {
  9.     static private const _NUM_TIMES:uint = 1000000;
  10.     
  11.     private function _init():void
  12.     {
  13.         _debug(
  14.             "各テスト " + _NUM_TIMES + " 回処理させた計算結果 [単位 : ミリ秒]\n" +
  15.             "(誤差は多少生じます)\n"
  16.         );
  17.         
  18.         var array:Array = [];
  19.         var vector1:Vector.<int> = new Vector.<int>(0false);
  20.         var vector2:Vector.<int> = new Vector.<int>(_NUM_TIMES, false);
  21.         var vector3:Vector.<int> = new Vector.<int>(_NUM_TIMES, true);
  22.         
  23.         for (var i:uint = 0; i < _NUM_TIMES; i++) {
  24.             array[i] = 0;
  25.             vector1[i] = 0;
  26.         }
  27.         
  28.         _measure("ループのみ"function ():void
  29.         {
  30.             for (var i:uint = 0; i < _NUM_TIMES; i++) {
  31.                 
  32.             }
  33.         });
  34.         
  35.         _measure("Array の要素に加算処理"function ():void
  36.         {
  37.             var e:uint;
  38.             for (var i:uint = 0, l:uint = array.length; i < l; i++) {
  39.                 array[i]++;
  40.             }
  41.         });
  42.         
  43.         _measure("Vector.<int>(0, false) の要素に加算処理"function ():void
  44.         {
  45.             var e:uint;
  46.             for (var i:uint = 0, l:uint = vector1.length; i < l; i++) {
  47.                 vector1[i]++;
  48.             }
  49.         });
  50.         
  51.         _measure("Vector.<int>(" + _NUM_TIMES + ", false) の要素に加算処理"function ():void
  52.         {
  53.             var e:uint;
  54.             for (var i:uint = 0, l:uint = vector2.length; i < l; i++) {
  55.                 vector2[i]++;
  56.             }
  57.         });
  58.         
  59.         _measure("Vector.<int>(" + _NUM_TIMES + ", true) の要素に加算処理"function ():void
  60.         {
  61.             var e:uint;
  62.             for (var i:uint = 0, l:uint = vector3.length; i < l; i++) {
  63.                 vector3[i]++;
  64.             }
  65.         });
  66.         
  67.         _debug("\n結果については言及しませんので, 各自ご判断ください.");
  68.     }
  69.     
  70.     private var _field:TextField;
  71.     private var _time:uint;
  72.     
  73.     public function Main():void
  74.     {
  75.         _setup();
  76.         _init();
  77.     }
  78.     
  79.     private function _measure(title:String, func:Function, ...params):void
  80.     {
  81.         _time = getTimer();
  82.         func.apply(null, params);
  83.         _time = getTimer() - _time;
  84.         
  85.         _debug("[ " + title + " ] --> " + _time + " ms");
  86.     }
  87.     
  88.     private function _debug(log:String):void
  89.     {
  90.         _field.appendText(log + "\n");
  91.     }
  92.     
  93.     private function _setup():void
  94.     {
  95.         _field = new TextField();
  96.         _field.width = stage.stageWidth - 40;
  97.         _field.height = stage.stageHeight - 60;
  98.         _field.x = 20;
  99.         _field.y = 60;
  100.         _field.multiline = true;
  101.         _field.wordWrap = true;
  102.         
  103.         var format:TextFormat = _field.defaultTextFormat;
  104.         format.font = "_sans";
  105.         _field.defaultTextFormat = format;
  106.         
  107.         addChild(_field);
  108.         
  109.         var button:Sprite = new Sprite();
  110.         button.graphics.lineStyle(1, 0xBBBBBB);
  111.         button.graphics.beginFill(0xEEEEEE);
  112.         button.graphics.drawRoundRect(001002055);
  113.         button.graphics.endFill();
  114.         
  115.         addChild(button);
  116.         
  117.         button.x = 20;
  118.         button.y = 20;
  119.         button.mouseChildren = false;
  120.         button.buttonMode = true;
  121.         
  122.         var field:TextField = new TextField();
  123.         field.width = 100;
  124.         field.height = 20;
  125.         field.htmlText = "<p align='center'><font face='_sans'>再計算</span></p>";
  126.         
  127.         button.addChild(field);
  128.         
  129.         button.addEventListener(MouseEvent.CLICK, function ():void
  130.         {
  131.             _field.text = "";
  132.             _init();
  133.         });
  134.     }
  135. }
  136. }
noswf
Get Adobe Flash Player