Skip to content

Instantly share code, notes, and snippets.

@bga
Created October 15, 2010 17:32
Show Gist options
  • Save bga/628591 to your computer and use it in GitHub Desktop.
Save bga/628591 to your computer and use it in GitHub Desktop.
// http://en.wikipedia.org/wiki/Fast_inverse_square_root
/*
Discovering old well known algorithm speed in js.
*/
/*
Update 1
Added 3rd variant - 1st with removed <y> varable. Hm, it really become more faster. Thanks Andrea!
*/
var _invSqrtL = (function()
{
var u32Array = new Uint32Array(1), f32Array = new Float32Array(u32Array.buffer);
return function(x)
{
f32Array[0] = x;
u32Array[0] = 0x5f3759df - (u32Array[0] >> 1);
var y = f32Array[0];
return y * (1.5 - 0.5 * x * y * y);
};
})();
_speedTest(
[
function(n)
{
// _invSqrtL inlined manualy
var u32Array = new Uint32Array(1), f32Array = new Float32Array(u32Array.buffer);
var s = 0;
var i = n; while(i--)
{
f32Array[0] = i;
u32Array[0] = 0x5f3759df - (u32Array[0] >> 1);
var y = f32Array[0];
s += y * (1.5 - 0.5 * i * y * y);
}
},
function(n)
{
var _sqrt = Math.sqrt; // caching for best speed
var s = 0;
var i = n; while(i--)
{
s += 1/_sqrt(i);
}
},
function(n)
{
// _invSqrtL inlined manualy
var u32Array = new Uint32Array(1), f32Array = new Float32Array(u32Array.buffer);
var s = 0;
var i = n; while(i--)
{
f32Array[0] = i;
u32Array[0] = 0x5f3759df - (u32Array[0] >> 1);
s += f32Array[0] * (1.5 - 0.5 * i * f32Array[0] * f32Array[0]);
}
}
],
10000
);
/*
chrome8 2000000
0: 796 ms
1: 368 ms
2: 1019 ms
ff4 8000000
0: 764 ms
1: 1476 ms
2: 508 ms
*/
/*
Yes it faster in js too, but only in one browser and requires special api.
Anyway nice.
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment