FAVORITE BY
:
:
performance tips
:
関数ポインタもためしてみたけど、やっぱり死ぬほど遅い・・もっとたくさん専用か
:
:
switchvsifelseproformancegood to know, if else better for one, switch better for more than 1
:
:
performance単純な比較はif、比較する数が多くなるとswitchが速い。たしかにswitchは速いと言われていた。
FORKED

[最適化 Tips] if ... else と switch での処理速度の違い [最適化 Tips] if ... else と switch と 三項演算 での処理速度の違い [diff(25)]

  1. // forked from muta244's [最適化 Tips] if ... else と switch での処理速度の違い
  2. // 三項演算も追加してみた。普通三項演算で10個も入れ子にしたりしないとは思いますが…
  3. package {
  4. import flash.display.*;
  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 n:uint = 10;
  20.         
  21.         _measure("ループのみ"function ():void
  22.         {
  23.             for (var i:uint = 0; i < _NUM_TIMES; i++) {
  24.                 
  25.             }
  26.         });
  27.         
  28.         _measure("1 回のみ比較する if ... else 文"function ():void
  29.         {
  30.             for (var i:uint = 0; i < _NUM_TIMES; i++) {
  31.                 if (n === 0) {}
  32.                 else {}
  33.             }
  34.         });
  35.         
  36.         _measure("1 回のみ比較する switch 文"function ():void
  37.         {
  38.             for (var i:uint = 0; i < _NUM_TIMES; i++) {
  39.                 switch (n) {
  40.                     case 0break;
  41.                     defaultbreak;
  42.                 }
  43.             }
  44.         });
  45.         
  46.         _measure("1 回のみ比較する 三項演算"function ():void
  47.         {
  48.             for (var i:uint = 0; i < _NUM_TIMES; i++) {
  49.                 (n === 0)? true : false ;
  50.             }
  51.         });
  52.         
  53.         _measure("10 回比較する if ... else 文"function ():void
  54.         {
  55.             for (var i:uint = 0; i < _NUM_TIMES; i++) {
  56.                 if (n === 0) {}
  57.                 else if (n === 1) {}
  58.                 else if (n === 2) {}
  59.                 else if (n === 3) {}
  60.                 else if (n === 4) {}
  61.                 else if (n === 5) {}
  62.                 else if (n === 6) {}
  63.                 else if (n === 7) {}
  64.                 else if (n === 8) {}
  65.                 else if (n === 9) {}
  66.                 else {}
  67.             }
  68.         });
  69.         
  70.         _measure("10 回比較する switch 文"function ():void
  71.         {
  72.             for (var i:uint = 0; i < _NUM_TIMES; i++) {
  73.                 switch (n) {
  74.                     case 0break;
  75.                     case 1break;
  76.                     case 2break;
  77.                     case 3break;
  78.                     case 4break;
  79.                     case 5break;
  80.                     case 6break;
  81.                     case 7break;
  82.                     case 8break;
  83.                     case 9break;
  84.                     defaultbreak;
  85.                 }
  86.             }
  87.         });
  88.         
  89.         _measure("10 回比較する 三項演算"function ():void
  90.         {
  91.             for (var i:uint = 0; i < _NUM_TIMES; i++) {
  92.                 (n === 0)? true
  93.                 :(n === 1)? true
  94.                 :(n === 2)? true
  95.                 :(n === 3)? true
  96.                 :(n === 4)? true
  97.                 :(n === 5)? true
  98.                 :(n === 6)? true
  99.                 :(n === 7)? true
  100.                 :(n === 8)? true
  101.                 :(n === 9)? truefalse;
  102.             }
  103.         });
  104.         
  105.         _debug("\n結果については言及しませんので, 各自ご判断ください.");
  106.     }
  107.     
  108.     private var _field:TextField;
  109.     private var _time:uint;
  110.     
  111.     public function Main():void
  112.     {
  113.         _setup();
  114.         _init();
  115.     }
  116.     
  117.     private function _measure(title:String, func:Function, ...params):void
  118.     {
  119.         _time = getTimer();
  120.         func.apply(null, params);
  121.         _time = getTimer() - _time;
  122.         
  123.         _debug("[ " + title + " ] --> " + _time + " ms");
  124.     }
  125.     
  126.     private function _debug(log:String):void
  127.     {
  128.         _field.appendText(log + "\n");
  129.     }
  130.     
  131.     private function _setup():void
  132.     {
  133.         _field = new TextField();
  134.         _field.width = stage.stageWidth - 40;
  135.         _field.height = stage.stageHeight - 60;
  136.         _field.x = 20;
  137.         _field.y = 60;
  138.         _field.multiline = true;
  139.         _field.wordWrap = true;
  140.         
  141.         var format:TextFormat = _field.defaultTextFormat;
  142.         format.font = "_sans";
  143.         _field.defaultTextFormat = format;
  144.         
  145.         addChild(_field);
  146.         
  147.         var button:Sprite = new Sprite();
  148.         button.graphics.lineStyle(1, 0xBBBBBB);
  149.         button.graphics.beginFill(0xEEEEEE);
  150.         button.graphics.drawRoundRect(001002055);
  151.         button.graphics.endFill();
  152.         
  153.         addChild(button);
  154.         
  155.         button.x = 20;
  156.         button.y = 20;
  157.         button.mouseChildren = false;
  158.         button.buttonMode = true;
  159.         
  160.         var field:TextField = new TextField();
  161.         field.width = 100;
  162.         field.height = 20;
  163.         field.htmlText = "<p align='center'><font face='_sans'>再計算</span></p>";
  164.         
  165.         button.addChild(field);
  166.         
  167.         button.addEventListener(MouseEvent.CLICK, function ():void
  168.         {
  169.             _field.text = "";
  170.             _init();
  171.         });
  172.     }
  173. }
  174. }
noswf

[最適化 Tips] if ... else と switch での処理速度の違い [最適化 Tips] 色々な整数化手段での処理速度の違い [diff(36)]

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