- Jun 3, 2013You could take as parameters

~t1 ~tdiff ~v1 ~vdiff

but I don't think this will make a big difference (this purely-integer

calculus is very fast already).

Does this particular function already show high in your profile?

On Mon, Jun 3, 2013 at 9:57 PM, Florent Monnier

<fmonnier@...> wrote:> Hi,

>

> Usually interpolations for mutlimedia programming are done with

> floats, but I'm trying to make it with ints in order to make it

> deterministic and also it's maybe faster for the RPi.

>

> So I'm trying to see how I could avoid the calculus that are done several times.

> Either with partial application, creating a closure, or even keeping

> the intermediate calculus (v_diff, t_diff) the stress test shows that

> the simplest (naive?) one is the fastest.

>

> Is there a way to optimise this?

>

> $ cat interpolint.mli

> (** Interpolation with ints *)

>

> val inter :

> t1:int -> t2:int ->

> v1:int -> v2:int -> int -> int

> (** simple interpolation *)

>

> type inter_func = int -> int

>

> val interp :

> t1:int -> t2:int ->

> v1:int -> v2:int -> inter_func

> (** interpolation with partial application *)

>

> type inter_value

>

> val interv :

> t1:int -> t2:int ->

> v1:int -> v2:int -> inter_value

>

> val intervf : inter_value -> int -> int

> (** interpolation with intermediate calculus done *)

>

> $ cat interpolint.ml

>

> let inter ~t1 ~t2 ~v1 ~v2 t =

> ((v2 - v1) * (t - t1)) / (t2 - t1) + v1

>

> type inter_func = int -> int

>

> let interp ~t1 ~t2 ~v1 ~v2 =

> let v_diff = (v2 - v1)

> and t_diff = (t2 - t1) in

> function t ->

> (v_diff * (t - t1)) / t_diff + v1

>

> type inter_value = int * int * int * int

>

> let interv ~t1 ~t2 ~v1 ~v2 =

> let v_diff = (v2 - v1)

> and t_diff = (t2 - t1) in

> (t1, v1, v_diff, t_diff)

>

> let intervf (t1, v1, v_diff, t_diff) t =

> (v_diff * (t - t1)) / t_diff + v1

>

> $ cat stress.ml

> open Interpolint

>

> let timeit n f s =

> let t0 = Unix.gettimeofday () in

> for i = 1 to n do f () done;

> let t1 = Unix.gettimeofday () in

> Printf.printf "time(%s): %f\n%!" s (t1 -. t0)

>

> let stress0 () =

> for t = 1000 to 1200 do

> let _ = inter ~t1:1000 ~t2:1200 ~v1:2 ~v2:8 t in

> ()

> done

>

> let stress1 () =

> let f = inter ~t1:1000 ~t2:1200 ~v1:2 ~v2:8 in

> for t = 1000 to 1200 do

> let _ = f t in

> ()

> done

>

> let stress2 () =

> let fi = interp ~t1:1000 ~t2:1200 ~v1:2 ~v2:8 in

> for t = 1000 to 1200 do

> let _ = fi t in

> ()

> done

>

> let stress3 () =

> let v = interv ~t1:1000 ~t2:1200 ~v1:2 ~v2:8 in

> for t = 1000 to 1200 do

> let _ = intervf v t in

> ()

> done

>

> let () =

> timeit 100_000 stress0 "stress0";

> timeit 100_000 stress1 "stress1";

> timeit 100_000 stress2 "stress2";

> timeit 100_000 stress3 "stress3";

> ;;

>

> $ ./stress.opt

> time(stress0): 0.267789

> time(stress1): 0.320826

> time(stress2): 0.287542

> time(stress3): 0.287472

>

> --

>

>

> ------------------------------------

>

> Archives up to December 31, 2011 are also downloadable at http://www.connettivo.net/cntprojects/ocaml_beginners

> The archives of the very official ocaml list (the seniors' one) can be found at http://caml.inria.fr

> Attachments are banned and you're asked to be polite, avoid flames etc.Yahoo! Groups Links

>

>

> - << Previous post in topic Next post in topic >>