English version
Accueil     À propos     Téléchargement     Ressources     Contactez-nous    

Ce site est rarement mis à jour. Pour les informations les plus récentes, rendez-vous sur le nouveau site OCaml à l'adresse ocaml.org.

Browse thread
Question about float refs.
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Ethan Burns <burns.ethan@g...>
Subject: Question about float refs.

I noticed a strange behavior when using references to floating point
values.  My suspicion, initially, was that the references would not be
boxed because they are the same as a record with a single mutable
field that is of type float.  It seems that OCaml still boxes float
refs.  Consider the following two pieces of code:

let r = ref 0.0 ;;
for i = 0 to 1000000000 do r := float i done;
Printf.printf "%f\n" !r;
Printf.printf "words: %f\n" (Gc.stat ()).Gc.minor_words
$ time ./a.out
words: 2000000373.000000
10.073 secs

This seems to perform a lot of allocations and it certainly takes a
long time to run.  But, now, if we use a record instead:

type float_ref = { mutable data : float }
let r = { data = 0.0 } ;;
for i = 0 to 1000000000 do r.data <- float i done;
Printf.printf "%f\n" r.data;
Printf.printf "words: %f\n" (Gc.stat ()).Gc.minor_words
$ time ./a.out
words: 373.000000
0.959 secs

It runs *much* quicker and hardly allocates anything.  My question is:
is there something better than creating a special float_ref type every
time I would like a reference to a floating point number?  Typically I
want a reference to something because it is going to change a lot in a
loop and then be accessed after the loop is complete so it is
undesirable for an allocation to occur each time the reference

Thanks in advance for any help,