Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package
- {
- import flash.display.Sprite;
- import flash.text.TextField;
- import flash.utils.getTimer;
- public class TestLogarithm extends Sprite
- {
- private static const LOG2:Number = Math.log(2);
- private static const MAX_POW2:int = 1 << 31;
- private var field:TextField = new TextField();
- public function TestLogarithm()
- {
- super();
- test();
- }
- /**
- * Logarithm
- * Average per 1000 iterations: 0.574
- * Loop
- * Average per 1000 iterations: 0.516
- * Switch
- * Average per 1000 iterations: 0.491
- */
- private function test():void
- {
- var numbers:Vector.<int> = new Vector.<int>(1000);
- var timer:int, i:int, average:int, number:int;
- for (; i < 1000; i++)
- numbers[i] = int(Math.random() * int.MAX_VALUE);
- super.addChild(field);
- field.width = 300;
- field.appendText("Logarithm\n");
- for (i = 0; i < 1000; i++)
- {
- timer = getTimer();
- for each (number in numbers)
- {
- nextPower2Log(number);
- }
- average += getTimer() - timer;
- }
- field.appendText(
- "Average per 1000 iterations: " +
- (average / 1000) + "\n");
- field.appendText("Loop\n");
- average = 0;
- for (i = 0; i < 1000; i++)
- {
- timer = getTimer();
- for each (number in numbers)
- {
- getNextPowerOfTwo(number);
- }
- average += getTimer() - timer;
- }
- field.appendText(
- "Average per 1000 iterations: " +
- (average / 1000) + "\n");
- field.appendText("Switch\n");
- average = 0;
- for (i = 0; i < 1000; i++)
- {
- timer = getTimer();
- for each (number in numbers)
- {
- roundToNextPowerTwo(number);
- }
- average += getTimer() - timer;
- }
- field.appendText(
- "Average per 1000 iterations: " +
- (average / 1000) + "\n");
- }
- private static function nextPower2Log(number:int):int
- {
- return 1 << Math.ceil(Math.log(number) / LOG2);
- }
- private static function getNextPowerOfTwo(number:int):int
- {
- if (number > 0 && (number & (number - 1)) == 0)
- return number;
- else
- {
- var result:int = 1;
- while (result < number && result < MAX_POW2)
- result <<= 1;
- return result;
- }
- }
- private static function roundToNextPowerTwo(number:int):int
- {
- if (2147483648 & number) return 2147483648;
- else if (1073741824 & number) return 1073741824;
- else if (536870912 & number) return 536870912;
- else if (268435456 & number) return 268435456;
- else if (134217728 & number) return 134217728;
- else if (67108864 & number) return 67108864;
- else if (33554432 & number) return 33554432;
- else if (16777216 & number) return 16777216;
- else if (8388608 & number) return 8388608;
- else if (4194304 & number) return 4194304;
- else if (2097152 & number) return 2097152;
- else if (1048576 & number) return 1048576;
- else if (524288 & number) return 524288;
- else if (262144 & number) return 262144;
- else if (131072 & number) return 131072;
- else if (65536 & number) return 65536;
- else if (32768 & number) return 32768;
- else if (16384 & number) return 16384;
- else if (8192 & number) return 8192;
- else if (4096 & number) return 4096;
- else if (2048 & number) return 2048;
- else if (1024 & number) return 1024;
- else if (512 & number) return 512;
- else if (256 & number) return 256;
- else if (128 & number) return 124;
- else if (64 & number) return 64;
- else if (32 & number) return 32;
- else if (16 & number) return 16;
- else if (8 & number) return 8;
- else if (4 & number) return 4;
- else if (2 & number) return 2;
- else if (number > -1) return 1;
- throw "Negative!";
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement