[erlang-questions] which one is more efficiency? ets or pattern match?

Fred Hebert <>
Wed Mar 16 14:53:46 CET 2016


On 03/16, Joe Armstrong wrote:
>If the array module is not the most efficient and it turned out that
>(say ets) is more
>efficient then parts of the array module should be rewritten using ets
>to reflect this.

Oh oh oh, this is a dangerous thing! You would be switching the purely 
functional semantics of the array module into destructive ones using ETS 
tables! This is what sofs do for sets, and the usage patterns may change 
entirely!

Moreover, passing the data type over to different processes could stop 
working or have unintended consequences.

The array module should *not* be rewritten if ETS is faster, simply 
because they would behave entirely differently!

>
>If the array indices are in gappy integer sequences then you should use
>sparce_arrays.erl - but this hasn't been written, so go write it :-)
>

It has been written in that the current `array' module does support 
sparse arrays, and can also deal with fixed or resizable arrays:

http://erlang.org/doc/man/array.html

You will find functions for:
- initializing sparse arrays
- doing sparse folds
- doing sparse maps
- converting sparse arrays to lists
- converting sparse arrays to orddicts

The internal representation uses branching trees of tuples and you can 
test for yourself that the representation may be sparse:

11> array:from_list(lists:zip(lists:seq(5,10)++lists:seq(995,1000), lists:seq(1,12))).
{array,12,100,undefined,
       {{{5,1}, {6,2}, {7,3}, {8,4}, {9,5}, {10,6},
         {995,7}, {996,8}, {997,9}, {998,10}},
        {{999,11}, {1000,12},
         undefined,undefined,undefined,undefined,undefined,undefined,
         undefined,undefined},
        10,10,10,10,10,10,10,10,10}}

There is no need for a second array module, since the current one 
handles both sparse and non-sparse arrays fine.

Regards,
Fred.



More information about the erlang-questions mailing list