[erlang-questions] process dictionary, anyone?

Ulf Wiger (TN/EAB) ulf.wiger@REDACTED
Mon Apr 30 11:11:39 CEST 2007


Torbjorn Tornkvist wrote:
> 
> Tony Rogvall skrev:
> > Hi !
> > 
> > I think most of us has used put/get at some point.
> > It will ALWAYS hit you back. You will spend hours trying to 
> locate the 
> > place where things went wrong. I do use put/get and I think 
> you will 
> > too.
> > But it's NOT a great little hack it's a disease.
> 
> Well spoken Tony!
> 
> To all Erlang newbee's: stay away from the process dicts!
> In fact, try to stay away from any destructive operation.
> 
> After 15 years of Erlang hacking I almost never use the 
> proc.dict (perhaps once every third year or so...:-)

I agree that it's easy to abuse the process dictionary,
but I can't see that using ets is any better. So the 
advice should be to avoid certain programming patterns.

Most importantly, don't sprinkle side-effects all over
your code, but try keep as much of your code as 
possible side-effect free.


Comparing the process dictionary an ets, there are 
pros and cons with each:

- process dictionary is a linear hash table, like 
  ets sets (but not exactly the same implementation)

- there's no copying when accessing the process 
  dictionary, but then again, there is GC. With ets,
  it's the other way around. (We have code where the
  process heap is sized so that all garbage of 
  short-lived processes fits on the heap. This means
  no copying - no GC).

- ets tables can be made to survive a process crash
  (by making some other process the owner). This can
  be a good thing, but forces you to use public ets
  tables (bad thing). I believe most ets tables in 
  use are public, which in a sense makes them worse
  than the process dictionaries.

- On a few occasions, it is actually useful to let
  several processes write to the same ets table, 
  but in most cases where it's contemplated, it's 
  a very bad idea.

- The contents of the process dictionary is included
  in crash reports, while the contents of ets tables
  are automatically wiped out when the owner dies -  
  bad for debugging, unless you make another process
  the owner, and make the table public, so you can
  write to it (which means everyone else can write 
  to it too - bad) 

- Of course, storing huge amounts of data in the 
  proc dict is bad because (a) it's GC:d, and 
  (b) all the data is dumped into the SASL crash
  reports, which are (by default) pretty-printed
  to the tty - potential diaster.

- ets has much better search and fold facilities
  (the process dictionary has practically none).

- Allowing many processes to write from an ets 
  table _can_ be very useful. This could be done
  with the process dictionary as well, but at 
  the moment, the only option available is to 
  read the entire dictionary at once (through
  process_info(P, dictionary). This involves 
  a copy, btw, just like with ets.

In short, I'd say that the process dictionary is 
no worse than any other kind of side-effect, but 
has some fairly unique advantages as well.

BR,
Ulf W

> -----Original Message-----
> From: erlang-questions-bounces@REDACTED 
> [mailto:erlang-questions-bounces@REDACTED] On Behalf Of 
> Torbjorn Tornkvist
> Sent: den 30 april 2007 10:12
> To: erlang-questions@REDACTED
> Subject: Re: [erlang-questions] process dictionary, anyone?
> 
> Tony Rogvall skrev:
> > Hi !
> > 
> > I think most of us has used put/get at some point.
> > It will ALWAYS hit you back. You will spend hours trying to 
> locate the 
> > place where things went wrong. I do use put/get and I think 
> you will 
> > too.
> > But it's NOT a great little hack it's a disease.
> 
> Well spoken Tony!
> 
> To all Erlang newbee's: stay away from the process dicts!
> In fact, try to stay away from any destructive operation.
> 
> After 15 years of Erlang hacking I almost never use the 
> proc.dict (perhaps once every third year or so...:-)
> 
> Cheers, Tobbe
> 
> > 
> > Happy hacking
> > 
> > /Tony
> > 
> > 
> > 
> > On 30 apr 2007, at 00.53, Bob Ippolito wrote:
> > 
> >> You can represent any non-functional construct with 
> message passing. 
> >> A side-effect is a side-effect... Erlang is clearly a hybrid 
> >> language, but it has a very useful subset that is purely 
> functional. 
> >> Much of what I've read in the standard library is written in that 
> >> purely functional subset, and the syntax and features of the 
> >> language/VM seem like they're designed to encourage and 
> support mostly that subset.
> >>
> >> Using the process dictionary is a great little hack that saves you 
> >> from refactoring a bunch of code to include an extra state 
> variable...
> >>
> >> -bob
> >>
> > 
> 
> _______________________________________________
> erlang-questions mailing list
> erlang-questions@REDACTED
> http://www.erlang.org/mailman/listinfo/erlang-questions
> 




More information about the erlang-questions mailing list