(* power 2 3 = 8 power 3 2 = 9 power x 0 = 1 *) let rec power x n = if n=0 then 1 else x * (power x (n-1)) let power17 x = power x 17;; let rec power' x n = if n=0 then .< 1 >. else .< .~x * .~(power' x (n-1)) >. let codepower17 = .< fun z -> .~ (power' .. 17) >. let power17' = .! codepower17 (* power17' is about 4-5 times faster than power 17 in the MetaOCaml bytecode compiler *) (* Q: How much time does it take to call power' and to compile? *) let sqr x = x * x;; let rec power x n = if n=0 then 1 else if (n mod 2) = 0 then sqr (power x (n / 2)) else x * (power x (n-1)) let power17 x = power x 17 let rec power' x n = if n=0 then .< 1 >. else if (n mod 2) = 0 then .< sqr .~(power' x (n / 2)) >. else .< .~x * .~(power' x (n-1)) >. let codepower17' = .< fun z -> .~(power' .. 17) >. let power17' = .! codepower17' (* Timing shows that staged power17' is still about 3 times faster than power17 (on 2), and it also looks like power17 is now 30% faster than before *) (* Q: Can we produce code that just multiplies and doesn't need to call sqr? *)