xref: /redis-3.2.3/deps/lua/test/fib.lua (revision 21d3294c)
1*21d3294cSantirez-- fibonacci function with cache
2*21d3294cSantirez
3*21d3294cSantirez-- very inefficient fibonacci function
4*21d3294cSantirezfunction fib(n)
5*21d3294cSantirez	N=N+1
6*21d3294cSantirez	if n<2 then
7*21d3294cSantirez		return n
8*21d3294cSantirez	else
9*21d3294cSantirez		return fib(n-1)+fib(n-2)
10*21d3294cSantirez	end
11*21d3294cSantirezend
12*21d3294cSantirez
13*21d3294cSantirez-- a general-purpose value cache
14*21d3294cSantirezfunction cache(f)
15*21d3294cSantirez	local c={}
16*21d3294cSantirez	return function (x)
17*21d3294cSantirez		local y=c[x]
18*21d3294cSantirez		if not y then
19*21d3294cSantirez			y=f(x)
20*21d3294cSantirez			c[x]=y
21*21d3294cSantirez		end
22*21d3294cSantirez		return y
23*21d3294cSantirez	end
24*21d3294cSantirezend
25*21d3294cSantirez
26*21d3294cSantirez-- run and time it
27*21d3294cSantirezfunction test(s,f)
28*21d3294cSantirez	N=0
29*21d3294cSantirez	local c=os.clock()
30*21d3294cSantirez	local v=f(n)
31*21d3294cSantirez	local t=os.clock()-c
32*21d3294cSantirez	print(s,n,v,t,N)
33*21d3294cSantirezend
34*21d3294cSantirez
35*21d3294cSantirezn=arg[1] or 24		-- for other values, do lua fib.lua XX
36*21d3294cSantirezn=tonumber(n)
37*21d3294cSantirezprint("","n","value","time","evals")
38*21d3294cSantireztest("plain",fib)
39*21d3294cSantirezfib=cache(fib)
40*21d3294cSantireztest("cached",fib)
41