[erlang-questions] Strange performance degradation in dict when it's storing lists

Park, Sungjin jinni.park@REDACTED
Tue Aug 23 03:25:28 CEST 2016


@Kyungho, could you please let me know how you changed the source?


On Tue, Aug 23, 2016 at 10:24 AM, Park, Sungjin <jinni.park@REDACTED>
wrote:

> @Sverker, you are right.  Still I'm curious what makes the big
> difference.  There was no such big difference when the values were tuples
> rather than lists.  The extra overhead you mentioned must be the same for
> both.
>
> @Kyungho, I tested in otp-18.  Can there possibly be any VM change related
> with this?
>
>
>
> On Tue, Aug 23, 2016 at 5:01 AM, Kyungho Yun <inanun@REDACTED> wrote:
>
>> Hi there.
>>
>> The various size of return values could be confusable.
>> So I tested original source and some modified source; value() ->
>> lists:seq(0,255),
>> though I couldn't get such a big value in OTP 19.
>>
>> But I guess GC might be the cause.
>>
>> and the reference of binary may use for messaging in same node.
>>
>>
>>
>> On Mon, Aug 22, 2016 at 10:53 PM, Sverker Eriksson <
>> sverker.eriksson@REDACTED> wrote:
>>
>>> Looks like you measure the latency of send + dict:find + receive
>>> that sometimes happens to get preemted by very heavy calls
>>> to lists:delete.
>>>
>>> /Sverker
>>>
>>>
>>>
>>> On 08/22/2016 10:35 AM, Park, Sungjin wrote:
>>>
>>> I observed a strange performance degradation in dict.  Let me share the
>>> code I used in the test first.
>>>
>>>
>>>     -module(data).
>>>     -export([start_link/1, get/1, get_concurrent/1]).
>>>     -export([init/0]).
>>>
>>>     start_link() ->
>>>       proc_lib:start_link(?MODULE, init, []).
>>>
>>>     init() ->
>>>       register(?MODULE, self()),
>>>       % Initialize data:
>>>       % 0 => [],
>>>       % 1 => [1],
>>>       % 2 => [1,2]
>>>       % ...
>>>       Dict = lists:foldl(
>>>         fun (Key, Dict0) -> dict:store(Key, value(Key), Dict0) end,
>>>         dict:new(), lists:seq(0, 255)
>>>       ),
>>>       proc_lib:init_ack({ok, self()}),
>>>       loop(Dict).
>>>
>>>     value(Key) ->
>>>         lists:seq(1, Key).
>>>
>>>     loop(Dict) ->
>>>       receive
>>>         {get, Key, From} ->
>>>           case dict:find(Key, Dict) of
>>>             {ok, Value} -> From ! Value;
>>>             error -> From ! undefined
>>>           end;
>>>         _ ->
>>>           ok
>>>       end,
>>>       loop(Dict).
>>>
>>>     get(Key) ->
>>>       ?MODULE ! {get, Key, self()},
>>>       receive
>>>         Value -> Value
>>>       end.
>>>
>>>     %% Run get N times and return average execution time.
>>>     -spec get_concurrent(integer()) -> number().
>>>     get_concurrent(N) ->
>>>       Profiler = self(),
>>>       Workers = [
>>>          prof_lib:spawn_link(
>>>            fun () ->
>>>              Key = erlang:system_time() rem 255,
>>>              Result = timer:tc(?MODULE, get, [Key]),
>>>              Profiler ! {self(), Result}
>>>            end
>>>          ) || _ <- lists:seq(1, N)
>>>        ],
>>>        Ts = receive_all(Workers, []),
>>>        lists:sum(Ts) / length(Ts).
>>>
>>>     receive_all([], Ts) ->
>>>       Ts;
>>>     receive_all(Workers, Ts) ->
>>>       receive
>>>         {Worker, {T, _}} -> receive_all(lists:delete(Worker, Workers), [T |
>>> Ts])
>>>       end.
>>>
>>>
>>> When I ran the test in the shell, I got.
>>>
>>>     1> data:start_link().
>>>     {ok, <0.6497.46>}
>>>     2> timer:tc(data, get, [5]).
>>>     {23,[1,2,3,4,5]}
>>>
>>>
>>> I could get a value in 23 microseconds and expected something not too
>>> slower results for concurrent get but,
>>>
>>>     3> data:get_concurrent(100000).
>>>     19442.828
>>>
>>>
>>> The value 19442.828 microseconds seemed to be too big a value so I tested
>>> with different values such as large binaries and tuples.  And this time the
>>> same get_concurrent(100000) gave me 200 something microseconds.
>>>
>>> I also tried the same with an ets instead of a dict, but there was no such
>>> performance degradation by the value type.
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> erlang-questions mailing listerlang-questions@REDACTED://erlang.org/mailman/listinfo/erlang-questions
>>>
>>>
>>>
>>> _______________________________________________
>>> erlang-questions mailing list
>>> erlang-questions@REDACTED
>>> http://erlang.org/mailman/listinfo/erlang-questions
>>>
>>>
>>
>
>
> --
> Park, Sungjin
> ------------------------------------------------------------
> -------------------------------------------------------
> Peculiar travel suggestions are dancing lessons from god.
>   -- The Books of Bokonon
> ------------------------------------------------------------
> -------------------------------------------------------
>



-- 
Park, Sungjin
-------------------------------------------------------------------------------------------------------------------
Peculiar travel suggestions are dancing lessons from god.
  -- The Books of Bokonon
-------------------------------------------------------------------------------------------------------------------
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20160823/3fb4bafb/attachment.htm>


More information about the erlang-questions mailing list