Skip to content

Instantly share code, notes, and snippets.

@dermotbalson
Created November 23, 2015 13:59
Show Gist options
  • Save dermotbalson/12c96a113fee2d26546f to your computer and use it in GitHub Desktop.
Save dermotbalson/12c96a113fee2d26546f to your computer and use it in GitHub Desktop.
Speed test
--# Main
-- Speed
local abs,cos,sin,tan,acos,asin,atan,deg,rad,floor,fmod,modf,max,min,pow,sqrt=math.abs,math.cos,
math.sin,math.tan,math.acos,math.asin,math.atan,math.deg,math.rad,math.floor,math.fmod,
math.modf,math.max,math.min,math.pow,math.sqrt
local fmod,modf,pack=math.fmod,math.modf,table.pack
function setup()
txt=""
n=100000000
local a,b,c,d=23,-45.54,86,4
local v1,v2=vec3(120,3,-34),vec3(412,4,23)
local tbl={1,2,3,4}
local tbl2={}
tbl2[1]={1,2}
tbl2[2]={3,4}
tbl2[3]={5,6}
txt=n.." iterations on iPad Air 2\n"
--[
t=os.time()
for i=1,n do
local e=abs(b)
end
u=os.time()-t
txt=txt.."\n".."abs = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e=cos(b)
end
u=os.time()-t
txt=txt.."\n".."cos = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e=sin(b)
end
u=os.time()-t
txt=txt.."\n".."sin = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e=tan(b)
end
u=os.time()-t
txt=txt.."\n".."tan = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e=acos(b)
end
u=os.time()-t
txt=txt.."\n".."acos = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e=asin(b)
end
u=os.time()-t
txt=txt.."\n".."asin = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e=atan(b,d)
end
u=os.time()-t
txt=txt.."\n".."atan = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e=deg(a)
end
u=os.time()-t
txt=txt.."\n".."deg = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e=rad(a)
end
u=os.time()-t
txt=txt.."\n".."rad = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e=floor(c)
end
u=os.time()-t
txt=txt.."\n".."floor = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e=max(b,c)
end
u=os.time()-t
txt=txt.."\n".."max = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e=min(b,c)
end
u=os.time()-t
txt=txt.."\n".."min = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e=pow(a,d)
end
u=os.time()-t
txt=txt.."\n".."pow = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e=sqrt(b)
end
u=os.time()-t
txt=txt.."\n".."sqrt = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e=b^0.5
end
u=os.time()-t
txt=txt.."\n".."^ const= "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e=b^d
end
u=os.time()-t
txt=txt.."\n".."^a= "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e=b//a
end
u=os.time()-t
txt=txt.."\n".."// = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e=fmod(a,b) --gives remainder
end
u=os.time()-t
txt=txt.."\n".."fmod = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e,f=modf(b) --gives integer and fraction
end
u=os.time()-t
txt=txt.."\n".."modf = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e=v1:dist(v2)
end
u=os.time()-t
txt=txt.."\n".."dist = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e=v1:normalize()
end
u=os.time()-t
txt=txt.."\n".."normalize = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e,f,g=v1:unpack()
end
u=os.time()-t
txt=txt.."\n".."unpack = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e,f,g=v1.x,v1.y,v1.z
end
u=os.time()-t
txt=txt.."\n".."faux unpack = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e=pack(a,b,c)
end
u=os.time()-t
txt=txt.."\n".."pack = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e=vec3(a,b,c)
end
u=os.time()-t
txt=txt.."\n".."vector pack = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e=v1+v2
end
u=os.time()-t
txt=txt.."\n".."vector add vector = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e=v1*a
end
u=os.time()-t
txt=txt.."\n".."vector multiply scalar = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e=v1/a
end
u=os.time()-t
txt=txt.."\n".."vector divide scalar = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e=v1*(1/a)
end
u=os.time()-t
txt=txt.."\n".."vector mult inverse scalar = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e,f,g = a*d,b*d,c*d
end
u=os.time()-t
txt=txt.."\n".."3 scalar multiply = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e,f,g = a/d,b/d,c/d
end
u=os.time()-t
txt=txt.."\n".."3 scalar divide = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e,f,g = a+d,b+d,c+d
end
u=os.time()-t
txt=txt.."\n".."3 scalar add = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e = v1:len()
end
u=os.time()-t
txt=txt.."\n".."len = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e = (a*a+b*b+c*c)^0.5
end
u=os.time()-t
txt=txt.."\n".."len decomp = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e = vec2(a,b)
end
u=os.time()-t
txt=txt.."\n".."make vec2 = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e = {a,b}
end
u=os.time()-t
txt=txt.."\n".."len decomp = "..u.." secs ("..math.floor(n/60/u).." per frame)"
t=os.time()
for i=1,n do
local e = b%d
end
u=os.time()-t
txt=txt.."\n".."% = "..u.." secs ("..math.floor(n/60/u).." per frame)"
print(txt)
end
function draw()
end
local floor=math.floor
function format(amount)
local formatted = floor(amount)
while true do
formatted, k = string.gsub(formatted, "^(-?%d+)(%d%d%d)", '%1,%2')
if (k==0) then
break
end
end
return formatted
end
--# Results
--[[
100000000 iterations on iPad Air 2
All built in functions have been localised first
^0.5 555,000 a^0.5
abc* 416,000 d,e,f=a*x,b*x,c*x (decomposed vec3)
abc+ 416,000 d,e,f=a+x,b+x,c+x (decomposed vec3)
// 416,000 integer division
abc/ 278,000 d,e,f=a/x,b/x,c/x (decomposed vec3)
%. 278,000 mod %
modf 238,000
^b 238,000 a^b
acos 238,000
asin 238,000
deg 238,000
rad 238,000
floor 238,000
abs 208,000
max 208,000
sqrt 208,000
min 185,000
fmod 167,000
cos 139,000
sin 139,000
tan 128,000
atan 128,000
pow 104,000
len 79,000 vec3 (92,000 if done with individual components)
dist 64,000
unpack 55,000 a=vec3:unpack()
x,y,z 42,000 x,y,z=v.x,v.y,v.z
vec3 28,000 d=vec3(a,b,c)
vec3+ 28,000 vec3 + vec3
vec3* 28,000 vec3 * a
vec3/ 28,000 vec3 / a
norm 22,000 normalize
pack 15,000 table.pack
--]]
--# Vector
Vec2 = {} --decomposed vector library. all inputs and outputs are floats.
local acos = math.acos
function Vec2.add(x1, y1, x2, y2)
return x1 + x2, y1 + y2
end
function Vec2.sub(x1, y1, x2, y2)
return x1 - x2, y1 - y2
end
function Vec2.mult(x, y, d)
return x * d, y * d
end
function Vec2.div(x, y, d)
return x / d, y / d
end
function Vec2.len(x, y)
return (x * x + y * y) ^ 0.5
end
function Vec2.lenSqr(x, y)
return x * x + y * y
end
function Vec2.dist(x1, y1, x2, y2)
return Vec2.len(x1 - x2, y1 - y2)
end
function Vec2.distSqr(x1, y1, x2, y2)
return Vec2.lenSqr(x1 - x2, y1 - y2)
end
function Vec2.normalize(x, y)
local d = 1/Vec2.len(x,y)
return x * d, y * d
end
function Vec2.dot(x1, y1, x2, y2)
return x1 * x2 + y1 * y2
end
function Vec2.cross(x1, y1, x2, y2)
return x1*y2-x2*y1
end
function Vec2.rotate90(x, y) --antiClockwise
return -y, x
end
function Vec2.angleBetween(x1, y1, x2, y2)
local dot = Vec2.dot(x1, y1, x2, y2)
return acos( dot / (Vec2.len(x1, y1) * Vec2.len(x2, y2)))
end
--# VectorTest
local V=Vec2
function setup()
txt=""
n=50000000 --iterations
--test data
local a,b,c,d=23,-45.54,86,4
local v1,v2=vec3(120,3,-34),vec3(412,4,23)
v3,v4=vec2(5,-2),vec2(3.623,789.43)
vx3,vy3,vx4,vy4=v3.x,v3.y,v4.x,v4.y
local tbl={1,2,3,4}
local tbl2={}
tbl2[1]={1,2}
tbl2[2]={3,4}
tbl2[3]={5,6}
txt="" --n.." iterations on iPad Air 2\n"
--[[
txt=txt.."Add\n"
t=os.time()
for i=1,n do
local e = v3+v4
end
u=os.time()-t
txt=txt..format(n/60/u).." = vectors\n"
t=os.time()
for i=1,n do
local e,f = Vec2.add(vx3,vy3,vx4,vy4)
end
u=os.time()-t
txt=txt..format(n/60/u).." = Vec2\n"
t=os.time()
for i=1,n do
local e,f = V.add(vx3,vy3,vx4,vy4)
end
u=os.time()-t
txt=txt..format(n/60/u).." = localised Vec2\n"
t=os.time()
for i=1,n do
local e,f = vx3+vy3,vx4+vy4
end
u=os.time()-t
txt=txt..format(n/60/u).." = no function\n"
--]]
--[[
txt=txt.."Multiply\n"
t=os.time()
for i=1,n do
local e = v3*a
end
u=os.time()-t
txt=txt..format(n/60/u).." = vectors\n"
t=os.time()
for i=1,n do
local e,f = Vec2.mult(vx3,vy3,a)
end
u=os.time()-t
txt=txt..format(n/60/u).." = Vec2\n"
t=os.time()
for i=1,n do
local e,f = V.mult(vx3,vy3,a)
end
u=os.time()-t
txt=txt..format(n/60/u).." = localised Vec2\n"
t=os.time()
for i=1,n do
local e,f = vx3*a,vy3*a
end
u=os.time()-t
txt=txt..format(n/60/u).." = no function\n"
--]]
--[[
txt=txt.."Divide\n"
t=os.time()
for i=1,n do
local e = v3/a
end
u=os.time()-t
txt=txt..format(n/60/u).." = vectors\n"
t=os.time()
for i=1,n do
local e,f = Vec2.div(vx3,vy3,a)
end
u=os.time()-t
txt=txt..format(n/60/u).." = Vec2\n"
t=os.time()
for i=1,n do
local e,f = V.div(vx3,vy3,a)
end
u=os.time()-t
txt=txt..format(n/60/u).." = localised Vec2\n"
t=os.time()
for i=1,n do
local e,f = vx3/a,vy3/a
end
u=os.time()-t
txt=txt..format(n/60/u).." = no function\n"
--]]
--[[
txt=txt.."Length\n"
t=os.time()
for i=1,n do
local e = v3:len()
end
u=os.time()-t
txt=txt..format(n/60/u).." = vectors\n"
t=os.time()
for i=1,n do
local e = Vec2.len(vx3,vy3)
end
u=os.time()-t
txt=txt..format(n/60/u).." = Vec2\n"
t=os.time()
for i=1,n do
local e = V.len(vx3,vy3)
end
u=os.time()-t
txt=txt..format(n/60/u).." = localised Vec2\n"
t=os.time()
for i=1,n do
local e = (vx3*vx3+vy3*vy3)^0.5
end
u=os.time()-t
txt=txt..format(n/60/u).." = no function\n"
--]]
--[[
txt=txt.."Normalize\n"
t=os.time()
for i=1,n do
local e = v3:normalize()
end
u=os.time()-t
txt=txt..format(n/60/u).." = vectors\n"
t=os.time()
for i=1,n do
local e = Vec2.normalize(vx3,vy3)
end
u=os.time()-t
txt=txt..format(n/60/u).." = Vec2\n"
t=os.time()
for i=1,n do
local e = V.normalize(vx3,vy3)
end
u=os.time()-t
txt=txt..format(n/60/u).." = localised Vec2\n"
t=os.time()
for i=1,n do
local e = 1/(vx3*vx3+vy3*vy3)^0.5
local f,g=vx3*e,vy3*e
end
u=os.time()-t
txt=txt..format(n/60/u).." = no function\n"
--]]
--[[
txt=txt.."Dot\n"
t=os.time()
for i=1,n do
local e = v3:dot(v4)
end
u=os.time()-t
txt=txt..format(n/60/u).." = vectors\n"
t=os.time()
for i=1,n do
local e = Vec2.dot(vx3,vy3,vx4,vy4)
end
u=os.time()-t
txt=txt..format(n/60/u).." = Vec2\n"
t=os.time()
for i=1,n do
local e = V.dot(vx3,vy3,vx4,vy4)
end
u=os.time()-t
txt=txt..format(n/60/u).." = localised Vec2\n"
t=os.time()
for i=1,n do
local e = vx3*vx4+vy3*vy4
end
u=os.time()-t
txt=txt..format(n/60/u).." = no function\n"
--]]
--[[
txt=txt.."Cross\n"
t=os.time()
for i=1,n do
local e = v3:cross(v4)
end
u=os.time()-t
txt=txt..format(n/60/u).." = vectors\n"
t=os.time()
for i=1,n do
local e = Vec2.cross(vx3,vy3,vx4,vy4)
end
u=os.time()-t
txt=txt..format(n/60/u).." = Vec2\n"
t=os.time()
for i=1,n do
local e = V.cross(vx3,vy3,vx4,vy4)
end
u=os.time()-t
txt=txt..format(n/60/u).." = localised Vec2\n"
t=os.time()
for i=1,n do
local e = vx3*vy4-vy3*vx4
end
u=os.time()-t
txt=txt..format(n/60/u).." = no function\n"
--]]
print(txt)
sound(SOUND_JUMP, 29119)
end
--------------------------
--[[
Add
23,809 = vectors
75,757 = Vec2
92,592 = localised Vec2
166,666 = no function
Multiply
25,252 = vectors
92,592 = Vec2
104,166 = localised Vec2
208,333 = no function
Divide
25,252 = vectors
92,592 = Vec2
119,047 = localised Vec2
208,333 = no function
Length
75,757 = vectors
59,523 = Vec2
69,444 = localised Vec2
75,757 = no function
Normalize
22,522 = vectors
37,878 = Vec2
39,682 = localised Vec2
59,523 = no function
Dot
43,859 = vectors
75,757 = Vec2
92,592 = localised Vec2
138,888 = no function
Cross
46,296 = vectors
75,757 = Vec2
92,592 = localised Vec2
138,888 = no function
--]]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment