I am wondering how to optimize the following OCaml simple code.
#load "unix.cma";; open Unix;; let time f x = let start = Unix.gettimeofday () in let res = f x in let stop = Unix.gettimeofday () in let () = Printf.printf "Execution time: %fs\n%!" (stop -. start) in res ;; let syracuse x = let rec aux x t = match x with 1 -> t |x -> if x mod 2 = 0 then aux (x / 2) (t + 1) else aux (3 * x + 1) (t+1) in aux x 0 ;; let syracuse2 x = let rec aux x t = if x = 1 then t else if x mod 2 = 0 then aux (x / 2) (t + 1) else aux (3 * x + 1) (t+1) in aux x 0 ;; let rec iterate_over n f l = if n = 0 then l else iterate_over (n-1) f ((f n)::l);; let syracuses n = iterate_over n syracuse ;; let syracuses2 n = iterate_over n syracuse2 ;; (time syracuses 100000);; (time syracuses2 100000);;
I made a first attempt replacing the
match with with
ifs but it slightly reduced the performance.
Execution time: 1.880309s Execution time: 1.920133s
I tried to replace the
succ t but it did not bring anything. I think that there are some redundancies in the operations performed when calling
mod 2 and dividing by
2 but I don't know how it can help.