Date: Tue, 12 Oct 1999 17:04:02 +0200
From: Damien Doligez <Damien.Doligez@inria.fr>
Subject: Re: About array
>From: Anton Moscal <email@example.com>
>Evaluation `f i' can cause GC call -> we must use modify function. Really
>we can check address of our fresh array after each `f i'. While this
>address remains unchanged we have no need to call `modify'. I think this
>will be good.
Wrong. There is no guarantee that the GC will move your fresh array.
In most cases it will not because the array will already be in the
>I made the following experiment:
[replacing Array.init with a home-brewed version]
>time became 0.97 sec (but this version will not work
>with float arrays)
Indeed, it only works with int arrays. And the only reason it's
faster is because it's monomorphic. All your GC-oriented "magic"
amounts to nothing (you're not avoiding the call to "modify").
In fact, with this "init" function is even faster:
let init l (f : int -> int) =
if l = 0 then [||] else
let res = create l (f 0) in
for i = 1 to pred l do
unsafe_set res i (f i)
(i.e. the standard library's "init" with a type constraint)
This archive was generated by hypermail 2b29 : Sun Jan 02 2000 - 11:58:27 MET