-
Notifications
You must be signed in to change notification settings - Fork 202
Description
I have an unexpected (to me) result, comparing native C code with the same
code executed by crossbridge, to the same code manually translated to actionscript.
The relative speeds are
2.043 native windows code
6.707 crossbridge compiled native code
25.3 native actionscript code
Losing a factor of 3.7 going from native C to SWC is not too bad, but I'm totally
shocked that the carefully written actionscript, using exactly the same algorithm,
should be a factor of 10 slower than native C. The code in question is crunching
numbers with doubles (in C) vs. with :Number in actionscript.
Native C:
double m = min (nr, min (ng, nb));
double nm = nv-m;
double ns = ns = nm / nv ;
double r1 = (nv - nr) / nm ;
double g1 = (nv - ng) / nm ;
double b1 = (nv - nb) / nm ;
double nh;
if (nv == nr)
{
if (m == ng)
nh = 5.0 + b1 ;
else
nh = 1.0 - g1 ;
}
else if (nv == ng)
{
if (m == nb)
nh = 1.0 + r1 ;
else
nh = 3.0 - b1 ;
}
else if (nv == nb)
{
if (m == nr)
nh = 3.0 + g1 ;
else
nh = 5.0 - r1 ;
}
Actionscript:
var m:Number = (nr<ng) ? ((nr<nb) ? nr : nb) : ((ng<nb) ? ng : nb);
var mm:Number = (nv - m);
var ns:Number = mm / nv ;
var r1:Number = (nv - nr) / mm ;
var g1:Number = (nv - ng) / mm ;
var b1:Number = (nv - nb) / mm ;
var nh:Number =
(nv==nb)
? ((m == nr) ? (3.0 + g1) : (5.0 - r1))
: ((nv == ng)
? ((m == nb) ? (1.0 + r1) : (3.0 - b1))
: ((m == ng) ? (5.0 + b1) : (1.0 - g1)));