Advertisement
Guest User

Untitled

a guest
Mar 17th, 2019
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package
  2. {
  3.     import flash.display.Sprite;
  4.     import flash.text.TextField;
  5.     import flash.utils.getTimer;
  6.    
  7.     public class TestLogarithm extends Sprite
  8.     {
  9.         private static const LOG2:Number = Math.log(2);
  10.        
  11.         private static const MAX_POW2:int = 1 << 31;
  12.        
  13.         private var field:TextField = new TextField();
  14.        
  15.         public function TestLogarithm()
  16.         {
  17.             super();
  18.             test();
  19.         }
  20.        
  21.         /**
  22.          * Logarithm
  23.          * Average per 1000 iterations: 0.574
  24.          * Loop
  25.          * Average per 1000 iterations: 0.516
  26.          * Switch
  27.          * Average per 1000 iterations: 0.491
  28.          */
  29.         private function test():void
  30.         {
  31.             var numbers:Vector.<int> = new Vector.<int>(1000);
  32.             var timer:int, i:int, average:int, number:int;
  33.             for (; i < 1000; i++)
  34.                 numbers[i] = int(Math.random() * int.MAX_VALUE);
  35.             super.addChild(field);
  36.             field.width = 300;
  37.             field.appendText("Logarithm\n");
  38.            
  39.             for (i = 0; i < 1000; i++)
  40.             {
  41.                 timer = getTimer();
  42.                 for each (number in numbers)
  43.                 {
  44.                     nextPower2Log(number);
  45.                 }
  46.                 average += getTimer() - timer;
  47.             }
  48.            
  49.             field.appendText(
  50.                 "Average per 1000 iterations: " +
  51.                 (average / 1000) + "\n");
  52.            
  53.             field.appendText("Loop\n");
  54.             average = 0;
  55.             for (i = 0; i < 1000; i++)
  56.             {
  57.                 timer = getTimer();
  58.                 for each (number in numbers)
  59.                 {
  60.                     getNextPowerOfTwo(number);
  61.                 }
  62.                 average += getTimer() - timer;
  63.             }
  64.            
  65.             field.appendText(
  66.                 "Average per 1000 iterations: " +
  67.                 (average / 1000) + "\n");
  68.            
  69.             field.appendText("Switch\n");
  70.             average = 0;
  71.             for (i = 0; i < 1000; i++)
  72.             {
  73.                 timer = getTimer();
  74.                 for each (number in numbers)
  75.                 {
  76.                     roundToNextPowerTwo(number);
  77.                 }
  78.                 average += getTimer() - timer;
  79.             }
  80.            
  81.             field.appendText(
  82.                 "Average per 1000 iterations: " +
  83.                 (average / 1000) + "\n");
  84.         }
  85.        
  86.         private static function nextPower2Log(number:int):int
  87.         {
  88.             return 1 << Math.ceil(Math.log(number) / LOG2);
  89.         }
  90.        
  91.         private static function getNextPowerOfTwo(number:int):int
  92.         {
  93.             if (number > 0 && (number & (number - 1)) == 0)
  94.                 return number;
  95.             else
  96.             {
  97.                 var result:int = 1;
  98.                 while (result < number && result < MAX_POW2)
  99.                     result <<= 1;
  100.                 return result;
  101.             }
  102.         }
  103.        
  104.         private static function roundToNextPowerTwo(number:int):int
  105.         {
  106.             if (2147483648 & number) return 2147483648;
  107.             else if (1073741824 & number) return 1073741824;
  108.             else if (536870912 & number) return 536870912;
  109.             else if (268435456 & number) return 268435456;
  110.             else if (134217728 & number) return 134217728;
  111.             else if (67108864 & number) return 67108864;
  112.             else if (33554432 & number) return 33554432;
  113.             else if (16777216 & number) return 16777216;
  114.             else if (8388608 & number) return 8388608;
  115.             else if (4194304 & number) return 4194304;
  116.             else if (2097152 & number) return 2097152;
  117.             else if (1048576 & number) return 1048576;
  118.             else if (524288 & number) return 524288;
  119.             else if (262144 & number) return 262144;
  120.             else if (131072 & number) return 131072;
  121.             else if (65536 & number) return 65536;
  122.             else if (32768 & number) return 32768;
  123.             else if (16384 & number) return 16384;
  124.             else if (8192 & number) return 8192;
  125.             else if (4096 & number) return 4096;
  126.             else if (2048 & number) return 2048;
  127.             else if (1024 & number) return 1024;
  128.             else if (512 & number) return 512;
  129.             else if (256 & number) return 256;
  130.             else if (128 & number) return 124;
  131.             else if (64 & number) return 64;
  132.             else if (32 & number) return 32;
  133.             else if (16 & number) return 16;
  134.             else if (8 & number) return 8;
  135.             else if (4 & number) return 4;
  136.             else if (2 & number) return 2;
  137.             else if (number > -1) return 1;
  138.             throw "Negative!";
  139.         }
  140.     }
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement