Mailing list for all users of the OCaml language and system.
 help / color / mirror / Atom feed
From: Xavier Leroy <Xavier.Leroy@inria.fr>
To: Michael Hicks <mwh@dsl.cis.upenn.edu>, caml-list@inria.fr
Subject: Re: one-time initialization
Date: Thu, 28 Jan 1999 11:38:29 +0100	[thread overview]
Message-ID: <19990128113829.62982@pauillac.inria.fr> (raw)
In-Reply-To: <199901280508.AAA21644@codex.cis.upenn.edu>; from Michael Hicks on Thu, Jan 28, 1999 at 12:08:23AM -0500

> I wonder if anyone knows how to optimize the following (simplified for the
> sake of dicussion) situation:
> 
> let global = ref None
> let init i =
>   global := Some i
> let f () =
>   match (!global) with
>     Some x -> x
>   | None -> failwith "not initialized";;
> let g() =
>   match (!global) with
>     ...
> 
> Essentially, there is some global state that is initialized once, and is
> used by all functions in the module.  In a more realistic situation, this
> state might be initialized by reading in a file.  Given that following
> initialization the global state never changes, it should be conceivable to
> eliminate the match and dereference;

The compiler certainly cannot do it for you, as it involves proving
that f and g are never applied before init is called...

> on my machine (pentium 166), the match
> and dereference result in about a 30% slowdown.  I've fooled around with
> some things, but haven't found anything that performs better than this
> straightforward approach or is any more elegant.

Here are a couple of faster, but perhaps less modular approaches:

* Get rid of the ref and the option, and initialize "global" with the
  right value the first time.  That involves reading the file when
  global is initialized, which might involve parsing (partially) the
  command-line to find the right file name.  E.g.:

  let global =
    let filename = <parse command line to find config file name, use default
                    file name if not found> in
    read_config_file global

  let f() = ... use global ...

* Keep the ref but get rid of the option.  You then need a dummy value
  of the type of your global state, and you're also no longer protected
  against forgetting to initialize it.

  let global = ref dummy_global_value
  let init i = global := i
  let f() = ... use !global ...

Regards,

- Xavier Leroy




  parent reply	other threads:[~1999-01-28 12:23 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
1999-01-28  5:08 Michael Hicks
1999-01-28  9:54 ` John Prevost
1999-01-28 14:47   ` Michael Hicks
1999-01-28 10:38 ` Xavier Leroy [this message]
1999-01-28 13:03 ` Adam P. Jenkins
1999-01-28 20:23 ` Gerd Stolpmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=19990128113829.62982@pauillac.inria.fr \
    --to=xavier.leroy@inria.fr \
    --cc=caml-list@inria.fr \
    --cc=mwh@dsl.cis.upenn.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox