Version française
Home     About     Download     Resources     Contact us    
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.
Hello,

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
1000000000.000000
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
1000000000.000000
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
changes.

Thanks in advance for any help,

Ethan