Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:23
erlang
0504-erts-Improve-map_SUITE-t_hashmap_balance.p...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0504-erts-Improve-map_SUITE-t_hashmap_balance.patch of Package erlang
From 09f42e601d5b227a0a0b5325e04b1b17669d5820 Mon Sep 17 00:00:00 2001 From: Sverker Eriksson <sverker@erlang.org> Date: Mon, 1 Mar 2021 16:57:59 +0100 Subject: [PATCH 2/2] erts: Improve map_SUITE:t_hashmap_balance --- erts/emulator/test/map_SUITE.erl | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/erts/emulator/test/map_SUITE.erl b/erts/emulator/test/map_SUITE.erl index a2a23d122a..9b5379b67f 100644 --- a/erts/emulator/test/map_SUITE.erl +++ b/erts/emulator/test/map_SUITE.erl @@ -2792,6 +2792,13 @@ t_hashmap_balance(_Config) -> ok. hashmap_balance(KeyFun) -> + %% For uniformly distributed hash values, the average number of nodes N + %% in a hashmap varies between 0.3*K and 0.4*K where K is number of keys. + %% The standard deviation of N is about sqrt(K)/3. + + %% For simplicity we use the higher expected average 0.4*K + %% and verfies that no map is too many standard deviation above it. + F = fun(I, {M0,Max0}) -> Key = KeyFun(I), M1 = M0#{Key => Key}, @@ -2803,9 +2810,9 @@ hashmap_balance(KeyFun) -> SD_diff = abs(Nodes - Avg) / StdDev, %%io:format("~p keys: ~p nodes avg=~p SD_diff=~p\n", %% [maps:size(M1), Nodes, Avg, SD_diff]), - {MaxDiff0, _} = Max0, + {MaxDiff0, _, Cnt} = Max0, case {Nodes > Avg, SD_diff > MaxDiff0} of - {true, true} -> {SD_diff, M1}; + {true, true} -> {SD_diff, M1, Cnt+1}; _ -> Max0 end; @@ -2814,13 +2821,15 @@ hashmap_balance(KeyFun) -> {M1, Max1} end, - {_,{MaxDiff,MaxMap}} = lists:foldl(F, - {#{}, {0, undefined}}, - lists:seq(1,10000)), + {_,{MaxDiff,MaxMap, FatCnt}} = lists:foldl(F, + {#{}, {0, undefined, 0}}, + lists:seq(1,10000)), case MaxMap of undefined -> - io:format("Wow, no maps below \"average\"\n", []); + io:format("Wow, no map with more than \"average\" number of nodes\n"); _ -> + io:format("Found ~p maps with more than \"average\" number of nodes\n", + [FatCnt]), io:format("Max std dev diff ~p for map of size ~p (nodes=~p, flatsize=~p)\n", [MaxDiff, maps:size(MaxMap), hashmap_nodes(MaxMap), erts_debug:flat_size(MaxMap)]) @@ -2829,7 +2838,6 @@ hashmap_balance(KeyFun) -> true = (MaxDiff < 6), % The probability of this line failing is about 0.000000001 % for a uniform hash. I've set the probability this "high" for now % to detect flaws in our make_internal_hash. - % Hard limit is 15 (see hashmap_over_estimated_heap_size). ok. hashmap_nodes(M) -> -- 2.26.2
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor