I put together a benchmark based on @zwetan's suggested benchmarks from AVMPlus. I could really go all out and pull in LOADS more benchmarks for all sorts of things, but for now I just focused on the number crunching.
The results are a little more mixed.
32bit
dblAdd: 382
dblDiv: 1057
dblDec: 403
dblInc: 403
dblMod: 28681
dblMul: 382
dblNeg: 161
dblSub: 383
TOTAL = 31852
AVERAGE = 3982
64bit
dblAdd: 388
dblDiv: 1080
dblDec: 404
dblInc: 416
dblMod: 35531
dblMul: 378
dblNeg: 153
dblSub: 378
TOTAL = 38728
AVERAGE = 4841
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
import flash.utils.getTimer;
import flash.utils.setTimeout;
[SWF(frameRate = "60", width = "800", height = "600", backgroundColor = "0x000000")]
public class Main extends Sprite
{
private static const NITER:uint = 100000000;
private const benchmarks:Vector.<Function> = new <Function>[dblAdd, dblDiv, dblDec, dblInc, dblMod, dblMul, dblNeg, dblSub];
private const numBenchmarks:uint = uint(benchmarks.length);
private var currentTest:uint = 0;
private var total:uint = 0;
private var textField:TextField;
public function Main()
{
super();
if (stage == null) addEventListener(Event.ADDED_TO_STAGE, init) else init();
}
protected function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
setTimeout(runTest, 1000);
textField = new TextField();
textField.defaultTextFormat = new TextFormat('_sans', 16, 0xFFFFFF);
textField.autoSize = TextFieldAutoSize.LEFT;
textField.cacheAsBitmap = true;
addChild(textField);
}
private function runTest():void
{
addEventListener(Event.ENTER_FRAME, enterFrameHandler);
}
private function enterFrameHandler(e:Event):void
{
textField.text += benchmarks[currentTest]();
textField.text += "\n";
currentTest++;
if (currentTest == numBenchmarks) testsComplete();
}
private function testsComplete():void
{
removeEventListener(Event.ENTER_FRAME, enterFrameHandler);
textField.text += "\n";
textField.text += String("TOTAL = " + total + "\n");
textField.text += String("AVERAGE = " + Math.round(total / numBenchmarks));
}
private function dblAdd():String
{
var a:Number=1.2;
var b:Number=2.4;
var c:Number = -3.2;
var fstart:uint = getTimer();
for(var i:int=0;i<NITER;i++){
a = b+c;
c = a+b;
b = c+a;
}
var ftime:uint = getTimer() - fstart;
total += ftime;
return String("dblAdd: " + ftime);
}
private function dblDiv():String
{
var a:Number=1.2;
var b:Number=2.4;
var c:Number = -3.2;
var fstart:uint = getTimer();
for(var i:uint=0;i<NITER;i++){
a = b/c;
c = a/b;
b = c/a;
}
var ftime:uint = getTimer() - fstart;
total += ftime;
return String("dblDiv: " + ftime);
}
private function dblDec():String
{
var a:Number=1.2;
var fstart:uint = getTimer();
for(var i1:int=0;i1<NITER;i1++) a--;
for(var i2:int=0;i2<NITER;i2++) --a;
var ftime:uint = getTimer() - fstart;
total += ftime;
return String("dblDec: " + ftime);
}
private function dblInc():String
{
var a:Number=1.2;
var fstart:uint = getTimer();
for(var i1:int=0;i1<NITER;i1++) a++;
for(var i2:int=0;i2<NITER;i2++) ++a;
var ftime:uint = getTimer() - fstart;
total += ftime;
return String("dblInc: " + ftime);
}
private function dblMod():String
{
var a:Number=1.2;
var b:Number=2.4;
var c:Number = -3.2;
var fstart:uint = getTimer();
for(var i:int=0;i<NITER;i++){
a = b%c;
c = a%b;
b = c%a;
}
var ftime:uint = getTimer() - fstart;
total += ftime;
return String("dblMod: " + ftime);
}
private function dblMul():String
{
var a:Number=1.2;
var b:Number=2.4;
var c:Number = -3.2;
var fstart:uint = getTimer();
for(var i:int=0;i<NITER;i++){
a = b*c;
c = a*b;
b = c*a;
}
var ftime:uint = getTimer() - fstart;
total += ftime;
return String("dblMul: " + ftime);
}
private function dblNeg():String
{
var a:Number=1.2;
var fstart:uint = getTimer();
for(var i:int=0;i<NITER;i++) a = -a;
var ftime:uint = getTimer() - fstart;
total += ftime;
return String("dblNeg: " + ftime);
}
private function dblSub():String
{
var a:Number=1.2;
var b:Number=2.4;
var c:Number = -3.2;
var fstart:uint = getTimer();
for(var i:int=0;i<NITER;i++){
a = b-c;
c = a-b;
b = c-a;
}
var ftime:uint = getTimer() - fstart;
total += ftime;
return String("dblSub: " + ftime);
}
}
}