caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Gerd Stolpmann <info@gerd-stolpmann.de>
To: Simon Cruanes <simon.cruanes.2007@m4x.org>
Cc: Gabriel Scherer <gabriel.scherer@gmail.com>,
	David House <dhouse@janestreet.com>,
	Julien Blond <julien.blond@gmail.com>,
	Damien Guichard <alphablock@orange.fr>,
	Caml Mailing List <caml-list@inria.fr>
Subject: Re: [Caml-list] How much optimized is the 'a option type ?
Date: Fri, 17 Jan 2014 18:57:01 +0100	[thread overview]
Message-ID: <1389981421.2999.63.camel@e130> (raw)
In-Reply-To: <20140117092229.GI11251@emmental.inria.fr>

[-- Attachment #1: Type: text/plain, Size: 3177 bytes --]

Am Freitag, den 17.01.2014, 10:22 +0100 schrieb Simon Cruanes:
> Le Fri, 17 Jan 2014, Gabriel Scherer a écrit :
> 
> > There have been recurrent discussions of optimizing `'a option` to
> > avoid allocation in some cases, which is interesting when it is used
> > as a default value for example. (The nice recent blog post by Thomas
> > Leonard also seems to assume that `'a option` is somehow optimized.)
> > 
> > My strictly personal opinion is that I doubt this would be a good
> > idea, because I expect a fair share of the programming practice that
> > currently use ('a option) to move to something like (('a,
> > error-description) either) later in their lifetime, and I wouldn't
> > want people to avoid to do that for performance concerns.
> > Historically, we've rather come to see special-case representation
> > optimizations (eg. array of floats) as a mistake -- but on the other
> > hand there is not much downside to record of floats.
> 
> I think optimization of some local uses of options, such as:

I also think that local uses of options (and other variant types) could
be candidates for optimization. Gabriel is right that the GC is good at
short-living values, but that still leaves room for getting better with
ultra-short-living values.

My idea would be to try to delay the allocation of the block, and to use
two registers, i.e. one for the tag, and one for the tagged inner value.
First when the constructed value is passed to some other function, or
returned, or stored inside another block, or in another register, the
allocation is really done. Of course, this could also result in more
work in total (especially when the compiler has no idea what the desired
fast path of the algorithm is), and I guess the real problem is that you
need a good heuristics to decide when to do this. But there are at least
two criterions at hand:

 - You are not under pressure with registers
 - All consumers of the constructed value are inside the same function

I guess this would result in a quite heavy patch for the comparatively
small effect, and that's why it is not yet done.


Gerd


> let rec iter_stream f s =
>     match (try Some (MyStream.get s) with End_of_stream -> None) with
>     | None -> ()
>     | Some (x, s') ->
>         f x;
>         iter_stream f s'
> 
> where an option is used to keep the function tail-rec (I've heard
> several people tell me they often need to use this), or other cases like
> optional parameters (which are not going to move to Either), would be
> useful and future-proof. I hope the current work on optimizations will
> help with this kind of cases (removing useless allocations of local
> options, references, exceptions when no escape is possible).
> 
> </wishlist>
> </2cents>
> </</>>
> 

-- 
------------------------------------------------------------
Gerd Stolpmann, Darmstadt, Germany    gerd@gerd-stolpmann.de
My OCaml site:          http://www.camlcity.org
Contact details:        http://www.camlcity.org/contact.html
Company homepage:       http://www.gerd-stolpmann.de
------------------------------------------------------------


[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 490 bytes --]

  reply	other threads:[~2014-01-17 17:57 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-01-17  7:35 Damien Guichard
2014-01-17  7:55 ` David House
2014-01-17  8:16   ` Julien Blond
2014-01-17  8:40     ` David House
2014-01-17  9:10       ` Gabriel Scherer
2014-01-17  9:22         ` Simon Cruanes
2014-01-17 17:57           ` Gerd Stolpmann [this message]
2014-01-18  1:35             ` Jon Harrop
2014-01-19  6:19               ` oleg
2014-01-21  1:51                 ` Francois Berenger
2014-01-18  1:01         ` Jon Harrop
2014-01-24 10:06         ` Alain Frisch
2014-01-24 10:16           ` Alain Frisch
2014-01-24 13:32             ` Yaron Minsky
     [not found]       ` <CAK=fH+jfi=GsMYBZzmuo=V5UAWimyxiiamY2+DkLg6F0i8XHGw@mail.gmail.com>
2014-01-17  9:11         ` David House
2014-01-17 11:23           ` Jonathan Kimmitt
2014-01-17 13:46             ` Nicolas Braud-Santoni
2014-01-17 13:56               ` Frédéric Bour
2014-01-17 14:02               ` Yaron Minsky
2014-01-17 14:09                 ` Simon Cruanes
2014-01-17 22:52                   ` Yaron Minsky
2014-01-18  1:37                   ` Jon Harrop
2014-01-17 14:24                 ` Gabriel Scherer
2014-01-17 22:29                   ` Yaron Minsky
2014-01-18  1:27                 ` Jon Harrop
2014-01-18  1:18             ` Jon Harrop
2014-01-20 10:16             ` Goswin von Brederlow
2014-01-20 11:23               ` Jonathan Kimmitt
2014-01-21  2:05                 ` Francois Berenger
2014-01-22 21:22                   ` Jon Harrop
2014-01-22 21:26               ` Jon Harrop
2014-01-23  9:29                 ` Goswin von Brederlow
2014-01-23 23:20                   ` Jon Harrop
2014-01-23 23:28                     ` Yotam Barnoy
2014-01-24  8:22                       ` Jon Harrop
2014-01-24  8:34                         ` Andreas Rossberg
2014-01-24 16:56                           ` Jon Harrop
2014-01-27 15:29                             ` Goswin von Brederlow
2014-01-27 16:18                               ` Yotam Barnoy
2014-01-29  7:56                                 ` Goswin von Brederlow
2014-01-29  8:32                                 ` Jon Harrop
2014-01-29 16:11                                   ` Yotam Barnoy
2014-01-30 18:43                                     ` Yotam Barnoy
2014-02-01 15:58                                       ` Goswin von Brederlow
2014-01-30 21:31                                     ` Jon Harrop
2014-01-30 21:43                                       ` Yotam Barnoy
2014-01-31  8:26                                         ` Jon Harrop
2014-02-01 15:40                                 ` Goswin von Brederlow
2014-01-27 10:03                         ` Goswin von Brederlow
2014-01-17 14:36 ` Markus Mottl
2014-01-17 15:49   ` Yotam Barnoy
2014-01-17 16:22     ` Markus Mottl
2014-01-20 10:09   ` Goswin von Brederlow

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=1389981421.2999.63.camel@e130 \
    --to=info@gerd-stolpmann.de \
    --cc=alphablock@orange.fr \
    --cc=caml-list@inria.fr \
    --cc=dhouse@janestreet.com \
    --cc=gabriel.scherer@gmail.com \
    --cc=julien.blond@gmail.com \
    --cc=simon.cruanes.2007@m4x.org \
    /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;
as well as URLs for NNTP newsgroup(s).