diff options
author | Sverker Eriksson <[email protected]> | 2018-02-21 22:05:10 +0100 |
---|---|---|
committer | Sverker Eriksson <[email protected]> | 2018-02-21 22:05:10 +0100 |
commit | 4d547dfb2a012ba1cf8fb9dd3cdc4d9df933a37f (patch) | |
tree | a6c61eaaa334d5ca99293628a48282669df51d14 /lib/kernel | |
parent | 9ca2c14787f42c5fe98c9c00364b508844059438 (diff) | |
download | otp-4d547dfb2a012ba1cf8fb9dd3cdc4d9df933a37f.tar.gz otp-4d547dfb2a012ba1cf8fb9dd3cdc4d9df933a37f.tar.bz2 otp-4d547dfb2a012ba1cf8fb9dd3cdc4d9df933a37f.zip |
erts: Optimize erlang:put/2 for immed values
Do destructive write of immed value if key exists.
This is an optimization at the expense of get/0
which must now copy all (mutable) key-value tuples.
Diffstat (limited to 'lib/kernel')
-rw-r--r-- | lib/kernel/test/pdict_SUITE.erl | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/lib/kernel/test/pdict_SUITE.erl b/lib/kernel/test/pdict_SUITE.erl index d105952df9..a891451c82 100644 --- a/lib/kernel/test/pdict_SUITE.erl +++ b/lib/kernel/test/pdict_SUITE.erl @@ -33,6 +33,7 @@ init_per_group/2,end_per_group/2, mixed/1, literals/1, + destructive/1, simple/1, complicated/1, heavy/1, simple_all_keys/1, info/1]). -export([init_per_testcase/2, end_per_testcase/2]). -export([other_process/2]). @@ -52,6 +53,7 @@ suite() -> all() -> [simple, complicated, heavy, simple_all_keys, info, literals, + destructive, mixed]. groups() -> @@ -367,6 +369,36 @@ match_keys(All) -> ok. +%% Test destructive put optimization of immed values +%% does not affect get/0 or process_info. +destructive(_Config) -> + Keys = lists:seq(1,100), + [put(Key, 17) || Key <- Keys], + Get1 = get(), + {dictionary,PI1} = process_info(self(), dictionary), + + [begin + {Key, 17} = lists:keyfind(Key, 1, Get1), + {Key, 17} = lists:keyfind(Key, 1, PI1) + end + || Key <- Keys], + + [17 = put(Key, 42) || Key <- Keys], % Mutate + + Get2 = get(), + {dictionary,PI2} = process_info(self(), dictionary), + + [begin + {Key, 17} = lists:keyfind(Key, 1, Get1), + {Key, 17} = lists:keyfind(Key, 1, PI1), + {Key, 42} = lists:keyfind(Key, 1, Get2), + {Key, 42} = lists:keyfind(Key, 1, PI2) + + end + || Key <- Keys], + + ok. + %% Do random mixed put/erase to test grow/shrink %% Written for a temporary bug in gc during shrink mixed(_Config) -> |