efficiency, deep lists
Luke Gorrie
luke@REDACTED
Tue Oct 2 12:35:47 CEST 2001
Ulf Wiger <etxuwig@REDACTED> writes:
> I've been playing around with continuation passing style when
> processing lists of lists. It does seem to be a bit cheaper than
> the alternative styles. If funs are optimized in R8, it should be
> even more so.
I'll throw in another continuation-based version (for any-depth
lists):
incr5(L) -> incr55(L, []).
%% incr55(DeepList, [Continuation])
incr55([H|T], C) when list(H) ->
incr55(H, [T|C]);
incr55([H|T], C) ->
[H+1|incr55(T, C)];
incr55([], [C|Cs]) ->
incr55(C, Cs);
incr55([], []) ->
[].
The basic difference here is the trick that most of the time you can
use a data structure instead of a fun for a continuation - which is
perhaps a bit easier to read in crash reports :-). I think that if you
did the any-depth implementation with funs, you'd have a chain of them
each calling the next, which is the same basic thing as my list of
continuations - which is fine too.
I don't know about the relative efficiency, timer:tc is giving me wide
ranges of numbers today. I would *guess* it's slightly cheaper since
it conses instead of making a fun, and makes a local call instead of
calling a fun.
--
Favourite Haiku error: Three things are certain:
Death, taxes, and lost data.
Guess which has occurred.
More information about the erlang-questions
mailing list