[erlang-questions] Process scope variable

ok@REDACTED ok@REDACTED
Fri Feb 20 11:20:22 CET 2015


>> Threading state through: 10 msec.
> Using a state process that was as lightweight as possible: 1670 msec.
>
>> This wasn't native compiled, and it didn't do any real work, so I
> don't expect real code to be 167 times slower using a state process.
> But I do expect it to be a lot slower.
>
> thank you very much for running this test! appreciate this.

I've now extended the measurements, on a different machine.

%% All measurements are milliseconds for 10,000,000 iterations of
%% a loop counting down.

%% c(foo).      c(foo, [native]).       method
%%   140           50                   pass a number around
%%   380          100                   pass {V,N}, build new N
%%   630          410                   process dictionary, atom key
%%  9260         9150                   other process, use dec
%% 16310        16010                   state held in other process,
                                        get/put two messages each.

The relevant ratio would seem to be 16010/100 = 160.1

16010 ms for 10,000,000 iterations is 1.601 sec for 1,000,000
iterations, or 1.6 µsec for 1 iteration.  Now each iteration
does four message sends, so that's 0.4 µsec per !+receive.

Stripped to the bone, using 'dec' instead of {put,_,N}, so that
each iteration does three message sends, for 0.3 µsec per !+receive.
The faster state process used this loop:

state_loop2(N, Pid) ->
    receive
        get -> Pid!N, state_loop2(N, Pid)
      ; dec -> state_loop2(update(N), Pid)
      ; eof -> ok
    end.

to keep the messages as small as possible and to eliminate a
reply for 'dec'.

I can see no advantage to putting state in another process
compared with putting state in the process dictionary.





More information about the erlang-questions mailing list