aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Ren <[email protected]>2016-10-06 18:27:07 +0800
committerSverker Eriksson <[email protected]>2016-10-10 15:10:29 +0200
commitc5a826b3d3a80726473fd9c2a7bea58b4363a993 (patch)
tree8f291b7c726f6d3fdf6ca598bf8841fa37e56407
parent88acd9cbdea2b342206b7a2e5ba8b904dbfd10a7 (diff)
downloadotp-c5a826b3d3a80726473fd9c2a7bea58b4363a993.tar.gz
otp-c5a826b3d3a80726473fd9c2a7bea58b4363a993.tar.bz2
otp-c5a826b3d3a80726473fd9c2a7bea58b4363a993.zip
Use atom value as hash value in process dictionary
In the origin implementation, the hash value of atom term is retrieved from the atom table. Reading the atom table is expensive since it is in memory and leads to more cache missing. The size of a process dictionary is usually small. The atom value (the index) is unique and can be hash value for it. Using the atom value directly should be more efficient.
-rw-r--r--erts/emulator/beam/beam_load.c2
-rw-r--r--erts/emulator/beam/erl_process_dict.c2
2 files changed, 2 insertions, 2 deletions
diff --git a/erts/emulator/beam/beam_load.c b/erts/emulator/beam/beam_load.c
index d69b18e22f..8aecf01bfd 100644
--- a/erts/emulator/beam/beam_load.c
+++ b/erts/emulator/beam/beam_load.c
@@ -4345,7 +4345,7 @@ hash_internal_genop_arg(LoaderState* stp, GenOpArg Key, Uint32* hx)
{
switch (Key.type) {
case TAG_a:
- *hx = atom_tab(atom_val(Key.val))->slot.bucket.hvalue;
+ *hx = atom_val(Key.val);
return 1;
case TAG_i:
*hx = Key.val;
diff --git a/erts/emulator/beam/erl_process_dict.c b/erts/emulator/beam/erl_process_dict.c
index d8c2eaba94..e05d81158d 100644
--- a/erts/emulator/beam/erl_process_dict.c
+++ b/erts/emulator/beam/erl_process_dict.c
@@ -56,7 +56,7 @@
#define MAKE_HASH(Term) \
((is_small(Term)) ? unsigned_val(Term) : \
((is_atom(Term)) ? \
- (atom_tab(atom_val(Term))->slot.bucket.hvalue) : \
+ atom_val(Term) : \
make_internal_hash(Term)))
#define PD_SZ2BYTES(Sz) (sizeof(ProcDict) + ((Sz) - 1)*sizeof(Eterm))