FORKED
  1. // forked from muta244's [最適化 Tips] オブジェクト生成による処理速度の違い
  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 = 50000;
  11.     
  12.     private function _init():void
  13.     {
  14.         _debug(
  15.             "各テスト " + _NUM_TIMES + " 回処理させた計算結果 [単位 : ミリ秒]\n" +
  16.             "(誤差は多少生じます)\n"
  17.         );
  18.         
  19.         var object:Object;
  20.         var array:Array;
  21.         
  22.         _measure("ループのみ"function ():void
  23.         {
  24.             for (var i:uint = 0; i < _NUM_TIMES; i++) {
  25.                 
  26.             }
  27.         });
  28.         
  29.         _measure("new Object() で生成"function ():void
  30.         {
  31.             for (var i:uint = 0; i < _NUM_TIMES; i++) {
  32.                 var object:Object = new Object();
  33.             }
  34.         });
  35.         
  36.         _measure("{} で生成"function ():void
  37.         {
  38.             for (var i:uint = 0; i < _NUM_TIMES; i++) {
  39.                 var object:Object = {};
  40.             }
  41.         });
  42.         
  43.         _measure("new Array() で生成"function ():void
  44.         {
  45.             for (var i:uint = 0; i < _NUM_TIMES; i++) {
  46.                 var array:Array = new Array();
  47.             }
  48.         });
  49.         
  50.         _measure("[] で生成"function ():void
  51.         {
  52.             for (var i:uint = 0; i < _NUM_TIMES; i++) {
  53.                 var array:Array = [];
  54.             }
  55.         });
  56.         
  57.         _measure("new Vector.<int>() で生成"function ():void
  58.         {
  59.             for (var i:uint = 0; i < _NUM_TIMES; i++) {
  60.                 var vector:Vector.<int> = new Vector.<int>();
  61.             }
  62.         });
  63.         
  64.         _measure("new Vector.<int>(0, true) で生成"function ():void
  65.         {
  66.             for (var i:uint = 0; i < _NUM_TIMES; i++) {
  67.                 var vector:Vector.<int> = new Vector.<int>(0true);
  68.             }
  69.         });
  70.         
  71.         _measure("【新規】new Vector.<int>([]) で生成"function ():void
  72.         {
  73.             for (var i:uint = 0; i < _NUM_TIMES; i++) {
  74.                 var vector:Vector.<int> = new Vector.<int>([]);
  75.             }
  76.         });
  77.         _measure("【新規】new Vector.<int>(30, true) で生成"function ():void
  78.         {
  79.             for (var i:uint = 0; i < _NUM_TIMES; i++) {
  80.                 var vector:Vector.<int> = new Vector.<int>(30true);
  81.             }
  82.         });
  83.         _measure("【新規】new Vector.<int>(30, false) で生成"function ():void
  84.         {
  85.             for (var i:uint = 0; i < _NUM_TIMES; i++) {
  86.                 var vector:Vector.<int> = new Vector.<int>(30false);
  87.             }
  88.         });
  89.         _measure("【新規】new Vector.<int>([0,1, ... ,8,9]) リテラル30個で生成"function ():void
  90.         {
  91.             for (var i:uint = 0; i < _NUM_TIMES; i++) {
  92.                 var vector:Vector.<int> = new Vector.<int>([0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9]);
  93.             }
  94.         });
  95.         
  96.         _measure("new Vector.<int>(1000, true) で生成"function ():void
  97.         {
  98.             for (var i:uint = 0; i < _NUM_TIMES; i++) {
  99.                 var vector:Vector.<int> = new Vector.<int>(1000true);
  100.             }
  101.         });
  102.         
  103.         _measure("new Vector.<int>(2000, true) で生成"function ():void
  104.         {
  105.             for (var i:uint = 0; i < _NUM_TIMES; i++) {
  106.                 var vector:Vector.<int> = new Vector.<int>(2000true);
  107.             }
  108.         });
  109.         
  110.         _measure("new Point() で生成"function ():void
  111.         {
  112.             for (var i:uint = 0; i < _NUM_TIMES; i++) {
  113.                 var point:Point = new Point();
  114.             }
  115.         });
  116.         
  117.         _measure("new Rectangle() で生成"function ():void
  118.         {
  119.             for (var i:uint = 0; i < _NUM_TIMES; i++) {
  120.                 var rectangle:Rectangle = new Rectangle();
  121.             }
  122.         });
  123.         
  124.         _measure("new Matrix() で生成"function ():void
  125.         {
  126.             for (var i:uint = 0; i < _NUM_TIMES; i++) {
  127.                 var matrix:Matrix = new Matrix();
  128.             }
  129.         });
  130.         
  131.         _measure("new Sprite() で生成"function ():void
  132.         {
  133.             for (var i:uint = 0; i < _NUM_TIMES; i++) {
  134.                 var sprite:Sprite = new Sprite();
  135.             }
  136.         });
  137.         
  138.         _measure("new Test() で独自クラス生成"function ():void
  139.         {
  140.             for (var i:uint = 0; i < _NUM_TIMES; i++) {
  141.                 var test:Test = new Test();
  142.             }
  143.         });
  144.         
  145.         _debug("\n結果については言及しませんので, 各自ご判断ください.");
  146.     }
  147.     
  148.     private var _field:TextField;
  149.     private var _time:uint;
  150.     
  151.     public function Main():void
  152.     {
  153.         _setup();
  154.         _init();
  155.     }
  156.     
  157.     private function _measure(title:String, func:Function, ...params):void
  158.     {
  159.         _time = getTimer();
  160.         func.apply(null, params);
  161.         _time = getTimer() - _time;
  162.         
  163.         _debug("[ " + title + " ] --> " + _time + " ms");
  164.     }
  165.     
  166.     private function _debug(log:String):void
  167.     {
  168.         _field.appendText(log + "\n");
  169.     }
  170.     
  171.     private function _setup():void
  172.     {
  173.         _field = new TextField();
  174.         _field.width = stage.stageWidth - 40;
  175.         _field.height = stage.stageHeight - 60;
  176.         _field.x = 20;
  177.         _field.y = 60;
  178.         _field.multiline = true;
  179.         _field.wordWrap = true;
  180.         
  181.         var format:TextFormat = _field.defaultTextFormat;
  182.         format.font = "_sans";
  183.         _field.defaultTextFormat = format;
  184.         
  185.         addChild(_field);
  186.         
  187.         var button:Sprite = new Sprite();
  188.         button.graphics.lineStyle(1, 0xBBBBBB);
  189.         button.graphics.beginFill(0xEEEEEE);
  190.         button.graphics.drawRoundRect(001002055);
  191.         button.graphics.endFill();
  192.         
  193.         addChild(button);
  194.         
  195.         button.x = 20;
  196.         button.y = 20;
  197.         button.mouseChildren = false;
  198.         button.buttonMode = true;
  199.         
  200.         var field:TextField = new TextField();
  201.         field.width = 100;
  202.         field.height = 20;
  203.         field.htmlText = "<p align='center'><font face='_sans'>再計算</span></p>";
  204.         
  205.         button.addChild(field);
  206.         
  207.         button.addEventListener(MouseEvent.CLICK, function ():void
  208.         {
  209.             _field.text = "";
  210.             _init();
  211.         });
  212.     }
  213. }
  214. }
  215. internal class Test
  216. {
  217.     
  218. }
noswf
  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:int = 0; i < _NUM_TIMES; i++) {
  31.                 
  32.             }
  33.         });
  34.         
  35.         _measure("Array を for で処理"function ():void
  36.         {
  37.             var e:int;
  38.             for (var i:uint = 0, l:uint = array.length; i < l; i++) {
  39.                 e = array[i];
  40.             }
  41.         });
  42.         
  43.         _measure("Array を for each で処理"function ():void
  44.         {
  45.             for each (var e:int in array) {
  46.                 
  47.             }
  48.         });
  49.         
  50.         _measure("Array を forEach で処理"function ():void
  51.         {
  52.             array.forEach(function (e:int, i:int, elements:Array):void
  53.             {
  54.                 
  55.             });
  56.         });
  57.         
  58.         _measure("Vector.<int>(0, false) を for で処理"function ():void
  59.         {
  60.             var e:int;
  61.             for (var i:uint = 0, l:uint = vector1.length; i < l; i++) {
  62.                 e = vector1[i];
  63.             }
  64.         });
  65.         
  66.         _measure("Vector.<int>(0, false) を for each で処理"function ():void
  67.         {
  68.             for each (var e:int in vector1) {
  69.                 
  70.             }
  71.         });
  72.         
  73.         _measure("Vector.<int>(0, false) を forEach で処理"function ():void
  74.         {
  75.             vector1.forEach(function (e:uint, i:uint, elements:Vector.<int>):void
  76.             {
  77.                 
  78.             });
  79.         });
  80.         
  81.         _measure("Vector.<int>(" + _NUM_TIMES + ", false) を for で処理"function ():void
  82.         {
  83.             var e:int;
  84.             for (var i:uint = 0, l:uint = vector2.length; i < l; i++) {
  85.                 e = vector2[i];
  86.             }
  87.         });
  88.         
  89.         _measure("Vector.<int>(" + _NUM_TIMES + ", false) を for each で処理"function ():void
  90.         {
  91.             for each (var e:uint in vector2) {
  92.                 
  93.             }
  94.         });
  95.         
  96.         _measure("Vector.<int>(" + _NUM_TIMES + ", false) を forEach で処理"function ():void
  97.         {
  98.             vector2.forEach(function (e:int, i:int, elements:Vector.<int>):void
  99.             {
  100.                 
  101.             });
  102.         });
  103.         
  104.         _measure("Vector.<int>(" + _NUM_TIMES + ", true) を for で処理"function ():void
  105.         {
  106.             var e:int;
  107.             for (var i:uint = 0, l:uint = vector3.length; i < l; i++) {
  108.                 e = vector3[i];
  109.             }
  110.         });
  111.         
  112.         _measure("Vector.<int>(" + _NUM_TIMES + ", true) を for each で処理"function ():void
  113.         {
  114.             for each (var e:int in vector3) {
  115.                 
  116.             }
  117.         });
  118.         
  119.         _measure("Vector.<int>(" + _NUM_TIMES + ", true) を forEach で処理"function ():void
  120.         {
  121.             vector3.forEach(function (e:int, i:int, elements:Vector.<int>):void
  122.             {
  123.                 
  124.             });
  125.         });
  126.         
  127.         _debug("\n結果については言及しませんので, 各自ご判断ください.");
  128.     }
  129.     
  130.     private var _field:TextField;
  131.     private var _time:uint;
  132.     
  133.     public function Main():void
  134.     {
  135.         _setup();
  136.         _init();
  137.     }
  138.     
  139.     private function _measure(title:String, func:Function, ...params):void
  140.     {
  141.         _time = getTimer();
  142.         func.apply(null, params);
  143.         _time = getTimer() - _time;
  144.         
  145.         _debug("[ " + title + " ] --> " + _time + " ms");
  146.     }
  147.     
  148.     private function _debug(log:String):void
  149.     {
  150.         _field.appendText(log + "\n");
  151.     }
  152.     
  153.     private function _setup():void
  154.     {
  155.         _field = new TextField();
  156.         _field.width = stage.stageWidth - 40;
  157.         _field.height = stage.stageHeight - 60;
  158.         _field.x = 20;
  159.         _field.y = 60;
  160.         _field.multiline = true;
  161.         _field.wordWrap = true;
  162.         
  163.         var format:TextFormat = _field.defaultTextFormat;
  164.         format.font = "_sans";
  165.         _field.defaultTextFormat = format;
  166.         
  167.         addChild(_field);
  168.         
  169.         var button:Sprite = new Sprite();
  170.         button.graphics.lineStyle(1, 0xBBBBBB);
  171.         button.graphics.beginFill(0xEEEEEE);
  172.         button.graphics.drawRoundRect(001002055);
  173.         button.graphics.endFill();
  174.         
  175.         addChild(button);
  176.         
  177.         button.x = 20;
  178.         button.y = 20;
  179.         button.mouseChildren = false;
  180.         button.buttonMode = true;
  181.         
  182.         var field:TextField = new TextField();
  183.         field.width = 100;
  184.         field.height = 20;
  185.         field.htmlText = "<p align='center'><font face='_sans'>再計算</span></p>";
  186.         
  187.         button.addChild(field);
  188.         
  189.         button.addEventListener(MouseEvent.CLICK, function ():void
  190.         {
  191.             _field.text = "";
  192.             _init();
  193.         });
  194.     }
  195. }
  196. }
noswf
Get Adobe Flash Player